【问题标题】:combining ssh and scp command in shell script在 shell 脚本中结合 ssh 和 scp 命令
【发布时间】:2018-06-07 15:19:11
【问题描述】:

有什么方法可以将以下命令组合成一个命令?我不想每次都登录每个命令。

sshpass -p 'somepwd' ssh user@server "mkdir -p /home/user/test"
sshpass -p 'somepwd' scp file.sh user@server:/home/user/test
sshpass -p 'somepwd' scp /test/somefile.txt user@server:/home/user/test
sshpass -p 'somepwd' ssh user@server -C "cd /home/user/test;./file.sh"

我确实检查了combing multiple commands when using ssh and scp 的答案;基于此,我仍然需要 3 个登录,一个用于第一个 ssh 和 mkdir,一个用于 scp,一个用于 ssh 并运行 shell 脚本。

有没有更好的解决方案?

【问题讨论】:

  • 您尝试过ssh 的基于密钥的身份验证方法吗?如果没有,请尝试搜索ssh-keygen 或搜索man ssh-keygen
  • 您可以使用rsync复制多个文件,它会根据需要自动创建目录。这样您就可以组合前 3 个命令。
  • ControlMaster 是你的朋友——你可以将一个连接用于多个命令。

标签: linux bash shell ssh scp


【解决方案1】:

使用 GNU tarssh

tar -c file.sh test/somefile.txt | sshpass -p 'somepwd' ssh user@server -C "tar -C / --transform 's|test/||;s|^|/home/user/test/|' --show-transformed-names -xv; cd /home/user/test; ./file.sh"

有关使用sshpass 传递密码的更安全方法,请参阅man sshpass

【讨论】:

  • 很好地使用tar!身份验证是如何完成的?
【解决方案2】:
  1. Use public/private keys 代替密码验证。这不仅会简化ssh 的使用,而且更加安全,尤其是在您连接到disallow password authentication on the server 之后。使用密码验证意味着您被黑客入侵,或者您的服务器已经被入侵而您还不知道。此答案的其余部分假设您已设置公钥/私钥。

  2. 我看到您在 /test 中有文件。不要将您的工作放在根目录中,这会引发安全问题。相反,除非您有正确设置权限的经验,否则请在您的主目录中工作。

  3. 因为file.sh 在您的当前目录中(不管是什么目录),并且您想要来自/test/ 的文件,所以您不能使用rsync。如果您的所有文件都位于同一目录中,rsync 将是一个不错的选择。

这是我们剩下的;我没有弄乱/test/的位置,因为我对任务了解不够:

ssh user@server "mkdir -p /home/user/test"
scp file.sh user@server:/home/user/test
scp /test/somefile.txt user@server:/home/user/test
ssh user@server -C "cd /home/user/test;./file.sh"

【讨论】:

  • 我在这个答案中唯一想念的是ControlMaster