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

combining ssh and scp command in shell script

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

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

有更好的解决方案吗?

使用 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

  1. Use public/private keys instead of password authentication. Not only will this simplify the use of ssh, it is much more secure, especially after you disallow password authentication on the server 您正在连接。使用密码身份验证意味着您 被黑客入侵,或者您的服务器已被入侵而您还不知道。此答案的其余部分假设您已设置 public/private 键。

  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"