分类
Bash Linux

怎样用 Bash 编程:循环

我使用过的所有编程语言都至少有两种循环结构来用来执行重复的操作。我经常使用 for 循环,然而我发现 while 和 until 循环也很有用处。

for 循环

我的理解是,在 bash 中实现的 for 命令比大部分语言灵活,因为它可以处理非数字的值;与之形成对比的是,诸如标准 C 语言的 for 循环只能处理数字类型的值。

Bash 版的 for 命令基本的结构很简单:

for Var in list1 ; do list2 ; done

解释一下:“对于 list1 中的每一个值,把 $Var 设置为那个值,使用该值执行 list2 中的程序语句;list1 中的值都执行完后,整个循环结束,退出循环。” list1 中的值可以是一个简单的显式字符串值,也可以是一个命令执行后的结果(`` 包含其内的命令执行的结果,本系列第二篇文章中有描述)。我经常使用这种结构。

分类
Bash

怎样用 Bash 编程:逻辑操作符和 shell 扩展

逻辑操作符是程序中进行判断的根本要素,也是执行不同的语句组合的依据。有时这也被称为流控制。

逻辑操作符

Bash 中有大量的用于不同条件表达式的逻辑操作符。最基本的是 if 控制结构,它判断一个条件,如果条件为真,就执行一些程序语句。操作符共有三类:文件、数字和非数字操作符。如果条件为真,所有的操作符返回真值(0),如果条件为假,返回假值(1)。

这些比较操作符的函数语法是,一个操作符加一个或两个参数放在中括号内,后面跟一系列程序语句,如果条件为真,程序语句执行,可能会有另一个程序语句列表,该列表在条件为假时执行:

if [ arg1 operator arg2 ] ; then list
或
if [ arg1 operator arg2 ] ; then list ; else list ; fi

像例子中那样,在比较表达式中,空格不能省略。中括号的每部分,[ 和 ],是跟 test 命令一样的传统的 Bash 符号:

if test arg1 operator arg2 ; then list

还有一个更新的语法能提供一点点便利,一些系统管理员比较喜欢用。这种格式对于不同版本的 Bash 和一些 shell 如 ksh(Korn shell)兼容性稍差。格式如下:

if [[ arg1 operator arg2 ]] ; then list
分类
Linux

怎样用 Bash 编程:语法和工具

Shell 是操作系统的命令解释器,其中 Bash 是我最喜欢的。每当用户或者系统管理员将命令输入系统的时候,Linux 的 shell 解释器就会把这些命令转换成操作系统可以理解的形式。而执行结果返回 shell 程序后,它会将结果输出到 STDOUT(标准输出),默认情况下,这些结果会显示在你的终端。所有我熟悉的 shell 同时也是一门编程语言。

Bash 是个功能强大的 shell,包含众多便捷特性,比如:tab 补全、命令回溯和再编辑、别名等。它的命令行默认编辑模式是 Emacs,但是我最喜欢的 Bash 特性之一是我可以将其更改为 Vi 模式,以使用那些储存在我肌肉记忆中的的编辑命令。

分类
Linux 容器 笔记 网络

UFW防火墙规则对Docker映射端口无效

在自己的服务器开启防火墙,使用UFW设置规则:

ufw default deny

默认禁用所有连接,测试发现,用Docker运行的APP端口能正常访问。

UFW是为了简化Iptables产生的,它在Iptables有自己的规则链。Docker在启动时在Iptables会创建自己的规则链,所以不生效。

分类
Linux 软件

Ubuntu安装XRDP

在Linux下一直没有好的远程桌面工具。VNC太慢,即使在内网也不太流畅。NoMachine不错,但连接需要安装客户端。NoMachine的移动端做得很垃圾,而且几年没更新,不兼容流海屏。远程用得最爽的还是windows自带的rdp,在低网速下也有很好的表现。

一般的远程工具采用录屏的方式,传输图像。如VNC,NoMachine,用h264压缩。虽然支持GPU加速,但在低宽带或高分辨率下质量差,延迟高。RDP不一样,它传输的是指令,绘图是放在客户端的,所以速度快,即使提高分辨率,速度也不会明显降低。

分类
Linux

SAMBA挂载,指定用户权限

Linux使用Samba挂载网络共享需安装cifs工具,在Ubuntu下安装:

sudo apt install cifs-utils

然后可以用mount挂载:

sudo mount.cifs //ip/共享目录 挂载目录

默认挂载后所有文件所属用户和组都是root,可以增加参数指定用户。

sudo mount.cifs -o rw,uid=wangzhengzhen,username=guest,password= //ip/共享目录 挂载目录
分类
Linux

Linux开机启动脚本

rc.load

/etc/rc.load 或 /etc/rc.d/rc.load

service

#!/bin/bash
#
### BEGIN INIT INFO
# Provides:          zz
# Required-Start:
# Required-Stop:
# Should-Start:      $network $time
# Should-Stop:       $network $time
# Default-Start:     3 4 5
# Default-Stop:
# Short-Description:
# Description:
### END INIT INFO
#

使用让系统开机命令加载脚本:
update-rc.d zz defaults 99

systemctl

systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和用户(user)之分,像需要开机不登陆就能运行的程序,就将程序存在系统服务里,即:/usr/lib/systemd/system目录下

该目录下的服务有以service结尾的,也有target结尾的。

分类
Linux 日记

Ubuntu升级至20.04

前几天Ubuntu 20.04 TLS (Focal Fossa)正式发布,家里的台式机是Ubuntu 18.04 TLS,决定升级到最新TLS版。

首先把系统软件升级到最新:

apt update

apt upgrade

然后执行 do-release-upgrade 如下:

默认TLS版只能升级到TLS版,并且只有第一个补丁版发布才能检测到升级。就是说只有20.04.1发布后才能升级。可以手动指定参数:

do-release-upgrade -m desktop -d

经过漫长的等待,终于更新完了。重启系统。

分类
Linux

Linux 防火墙 ufw 简介

ufw(简单防火墙Uncomplicated FireWall)真正地简化了 iptables,它从出现的这几年,已经成为 Ubuntu 和 Debian 等系统上的默认防火墙。而且 ufw 出乎意料的简单,这对新管理员来说是一个福音,否则他们可能需要投入大量时间来学习防火墙管理。

ufw 也有 GUI 客户端(例如 gufw),但是 ufw 命令通常在命令行上执行的。本文介绍了一些使用 ufw 的命令,并研究了它的工作方式。

首先,快速查看 ufw 配置的方法是查看其配置文件 —— /etc/default/ufw。使用下面的命令可以查看其配置,使用 grep 来抑制了空行和注释(以 # 开头的行)的显示。

$ grep -v '^#\|^$' /etc/default/ufw
IPV6=yes
DEFAULT_INPUT_POLICY="DROP"
DEFAULT_OUTPUT_POLICY="ACCEPT"
DEFAULT_FORWARD_POLICY="DROP"
DEFAULT_APPLICATION_POLICY="SKIP"
MANAGE_BUILTINS=no
IPT_SYSCTL=/etc/ufw/sysctl.conf
IPT_MODULES="nf_conntrack_ftp nf_nat_ftp nf_conntrack_netbios_ns"

正如你所看到的,默认策略是丢弃输入但允许输出。允许你接受特定的连接的其它规则是需要单独配置的。

ufw 命令的基本语法如下所示,但是这个概要并不意味着你只需要输入 ufw 就行,而是一个告诉你需要哪些参数的快速提示。

ufw [--dry-run] [options] [rule syntax]
分类
Linux

使用 split 命令分割 Linux 文件

一些简单的 Linux 命令能让你根据需要分割以及重新组合文件,来适应存储或电子邮件附件大小的限制。

Linux 系统提供了一个非常易于使用的命令来分割文件。在将文件上传到限制大小的存储网站或者作为邮件附件之前,你可能需要执行此操作。要将文件分割为多个文件块,只需使用 split 命令。