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

Ser*_*nov 0 bash terminal pipe

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

cat ~/.ssh/id_rsa.pub | ssh git@remote-server "mkdir -p ~/.ssh && cat >>  ~/.ssh/authorized_keys"
Run Code Online (Sandbox Code Playgroud)

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

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

cat "content_to_be_added" >> file_to_be_appended
Run Code Online (Sandbox Code Playgroud)

所以,如果我没记错的话,id_rsa.pub应该在 >> 之前注入内容,以使其正常工作。那么,这个功能究竟如何,为什么?

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

Kus*_*nda 6

命令

cat >> ~/.ssh/authorized_keys
Run Code Online (Sandbox Code Playgroud)

从标准输入读取(因为没有提供文件名cat来读取)并附加到命名文件。该>>重定向操作员打开目标文件进行追加。使用>代替>>会在写入数据之前截断(清空)目标文件。

该远程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
Run Code Online (Sandbox Code Playgroud)

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

ssh git@remote-server 'mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys' < ~/.ssh/id_rsa.pub
Run Code Online (Sandbox Code Playgroud)

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

ssh git@remote-server 'cat >> ~/.ssh/authorized_keys' < ~/.ssh/id_rsa.pub
Run Code Online (Sandbox Code Playgroud)

  • `回声是的| ssh user@remote-server cat` 会这样做——它是从标准输入读取的 cat,而不是 echo。 (2认同)