数据流(输入、输出、错误)
我们输入 ls 命令,敲回车时,键盘就是输入;
屏幕显示目录里列表,屏幕就是输出。
这种情况我们随时在做。
简写:
stdin 标准输入
stdout 标准输出
stderr 标准错误
默认情况下我们输入 sudo dnf update,会收到一个command not found的信息,那是因为在ubuntu中,默认未装dnf。这是标准错误。它也在屏幕上输出。
你知道标准输出与标准错误的区别吗?
我们输入:echo $?
将返上一个命令的返回码。比如上面的dnf update 后执行将返回1;而输入 ls 类似的命令,再执行 echo $? 将返回0
0 表示成功,
1 表示失败
我们再试一个命令,查找所有文件:
find /etc -type f
输出一大堆文件,然后再查看返回码:
echo $?
发现返回的是 1 ,我们查看前面返回的文件列里,确实有权限不足的提示,那说明这个find命令同时给了我们标准输出和标准错误。
但我们是可以分开他们的。
我们再输入一次这个find命令,略有不同:
find /etc -type f 2> /dev/null
再查输出,发现输出是没有任何错误的,为什么?
我们已将标准错误重定向了。
数字2 代表标准错误,它被重定向到了 /dev/null。/dev/null是个黑洞,什么东西进入它都会不可见 ,我们可以认为就是删除。
标准输入用 0 表示,标准输出是1,标准错误是2。
再试一个命令:
find /etc -type f > ~/results.txt
发现只输出了错误信息。不加数字默认是指标准输出,相当于
find /etc -type f 1> ~/results.txt
已将标准输出重定到文件,剩下错误信息在屏幕上。
再看下面命令:
find /etc -type f 1> ~/results.txt 2> ~/errors.txt
该命令将标准输出保存到results.txt,标准错误输出到 errors.txt
将 > 改成 >> 表示在文件后面添加,而不是覆盖
find /etc -type f >> ~/results.txt 2>> ~/errors.txt
nano
nano是简单的文本编辑工具,一般默认都安装,当然也得确认下是否安装。
which nano
与vim不同,不需要切换模式,可以直接输入。
直接键入 nano,输入内容,再按 ctrl+o ,输入文件名回车保存。
按ctrl+x 退出。
可以使用 ctrl+w 查找具体的单词,找到再进行修改。
ctrl + k 剪切一行,放在剪切板里
ctrl + u 粘贴剪切板的那一行
可以使用 ctrl + g 查找帮助
还有一些小技巧:
nano +15 sshd_config 表示编辑sshd_config,并定位到第15行
nano -v sshd_config 表示以查看方式打开,防止意外修改
有已打开的nano中定位到某行,需要选按 ctrl +w,再按 ctrl + t,然后输入行数即可定向具体位置。
nano还支持拼写检查,要安装拼写包
sudo apt install spell
再在nano中,按 ctrl+t ,检查拼写可能错误的词,然后进行替换。
SCP复制文件
安全地复制文件
# 复制本地的 note.txt 到远端的服务器
scp note.txt kelemi@ubuntu-2:/home/kelemi/ # 可以省略地址,默认到用户主目录
scp note.txt kelemi@ubuntu-2: # 如果两端用户一样,也可省略用户
scp note.txt ubuntu-2: # 从远端复制文件到当前目录
scp kekemi@ubuntu-2:note.txt . # 复制整个目录 到本地当前目录
scp -r kelemi@ubuntu-2:/etc .ls -l etc/ | lhead # 题外话,临时执行远端主机的命令。执行完成就断开
ssh kelemi@ubuntu-2 ls /etc
使用rsync传输文件
# 与SCP类似,但SCP适合一次性的复制。
# 命令与 SCP 也相似
rsync -r files ubuntu-2:
# 将本地文件夹 files 复制到 ubuntu-2
rsync -rv files ubuntu-2:
# 加上 -v 参数查看详细过程,这个与SCP不同
# 在文件夹files里新建两个新文件,然后再执行rsync,确认文件已同步过去了
touch new_file.txt
touch new_file2.txt
rsync -rv files ubuntu-2: # 默认情况下,本地删除文件,对端不会删除
# 测试在files文件夹里删除一些文件,然后再作同步,发现对端是不会删的
rm file*rsync -rv files ubuntu-2: # 加上 --delete 参数,对端也会同步删除
rsync -rv --delete files ubuntu-2: # 默认,源文件修改,执行rsync后,目的地文件也会被修改
# 有时候,我们希望备份后再作同步,可以加上 参数 b
# 备份的旧文件会加上波浪号 ~,比如原文件test.txt变成 test.txt~
rsync -rvb --delete files ubuntu-2: # 上面命令有个问题,它会将所有的旧文件都打上 ~,即便未修改的文件也如此
# 这样会导致混乱,我们一般将 r 改成 a,表示存档,这样只同步修改的文件
# b参数一般是可选的,所以 -av 是最常用的参数
rm *~
# 先删除之前的备份文件
rsync -avb --delete files ubuntu-2: # 还有一个比较常见的参数是 z,用于压缩,在慢速的网络比较有用,但会增加CPU负担 # 另一个比较常见的选项是 dry-run,用于试运行。看看效果,实际不会修改
rsync -avb --dry-run --delete files ubuntu-2: # 有时我们需要重定向备份目录,实际中其实很重要
# 比如增量备份,如果都在一个目录,运行5次 rsync 实际只保留一个备份
# 我们希望能保留历史记录
rsync -av --delete --backup-dir=incremental files ubuntu-2:
# 看到 ubuntu-2 自动新建了incremental目录,并将修改的文件存在这里面 # 文件夹应该是动态生dn的,这样就能保存多个,比如日期
# 使用 $(date +%F),可以生成 2022-3-27 之类的文件夹,
# 每日执行这个备份脚本,这种方式比较有用
rsync -av --delete --backup-dir=$(date +%F) files ubuntu-2: # rsync 命令参数比 scp 多得多,可以查看帮助
man rsync