Linux必备知识(二)

数据流(输入、输出、错误)

我们输入 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

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注