需要帮助理解带有管道、重定向和远程连接的 shell 命令

需要帮助理解带有管道、重定向和远程连接的 shell 命令

我有一些使用 bash 的经验,但是我在教程中看到的这个命令让我措手不及:

cat ~/.ssh/id_rsa.pub | ssh git@remote-server "mkdir -p ~/.ssh && cat >>  ~/.ssh/authorized_keys"

我知道该命令的作用。它获取文件的输出~/.ssh/id_rsa.pub,然后ssh发送到远程服务器,在用户主目录下创建一个名为 .ssh 的新目录,然后创建一个名为 的新文件authorized_keys并将内容倒入id_rsa.pub该文件中。我不明白的是,此时文件的内容id_rsa.pub得到注入到授权密钥文件中。

所以,我知道管道 (|) 将输出发送到其左侧,并将其提供给右侧的命令。但通常我们使用 cat 命令是这样的:

cat "content_to_be_added" >> file_to_be_appended

因此,如果我没有记错的话,id_rsa.pub应该在 >> 之前注入 的内容才能使其正常工作。那么,它到底是如何运作的以及为什么呢?

顺便说一句,请随时纠正我的术语。如果您能告诉我这里的操作员是否>>有具体名称,我也将不胜感激。

答案1

命令

cat >> ~/.ssh/authorized_keys

从标准输入读取(因为没有指定要cat读取的文件名)并附加到指定文件。重定向>>操作符打开目标文件追加。使用>in 代替>>会在写入数据之前截断(清空)目标文件。

该远程命令的标准输入数据cat来自哪里?标准输入流是cat从远程 shell 继承的。远程 shell 继承了标准输入流ssh。标准输入ssh来自本地cat命令的管道,该命令读取~/.ssh/id_rsa.pub文件。


cat您的管道中不需要本地:

ssh git@remote-server 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys' < ~/.ssh/id_rsa.pub

但请注意,如果mkdir确实创建了一个目录,则该目录需要具有正确的权限才能ssh正常工作:

ssh git@remote-server 'mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys' < ~/.ssh/id_rsa.pub

或者,您可能只是选择不附加数据:

ssh git@remote-server 'cat >> ~/.ssh/authorized_keys' < ~/.ssh/id_rsa.pub

答案2

对于cat,如果没有给出文件名,它将把 stdin 复制到 stdout。

>>称为输出重定向运算符。

简单cat >> filename地会附加数据来自文件“filename”的标准输入。

在您的示例中:cat "content_to_be_added"“content_to_be_added”并不是真正的内容,它是输入文件的名称。

相关内容