在shell脚本中组合ssh和scp命令

时间:2017-12-26 22:30:55

标签: linux bash shell ssh scp

有什么办法可以将以下命令合并到一个命令中吗?我不想每次都为每个命令登录。

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脚本。

有更好的解决方案吗?

2 个答案:

答案 0 :(得分:2)

  1. Use public/private keys代替密码验证。这不仅可以简化ssh的使用,而且更安全,尤其是在您连接disallow password authentication on the server之后。使用密码身份验证意味着您被黑客入侵,或者您的服务器已经被入侵,而您还不知道。本答案的其余部分假设您已设置公钥/私钥。

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

  3. 由于file.sh位于您当前的目录中(无论是什么),并且您想要/test/的文件,因此无法使用rsync。如果您的所有文件都位于同一目录中,rsync将是一个不错的选择。

  4. 这就是我们留下的东西;我没有弄乱/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"
    

答案 1 :(得分: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