我不知道名称,但基本上我们的公司环境是由跳线者设置的,所以创建一个ssh隧道真的很慢。因此,我希望有一些方法可以在一个ssh命令中执行这三个步骤:
$ scp localfile.jar user@server:~/path/ # upload executable
$ ssh user@server java -jar path/localfile.jar some argument >path/output.bin # run it
$ scp user@server:~/path/output.bin . # download output这就是方法。有办法吗?(服务器无法访问我的本地机器,但这可能是显而易见的。)谢谢!
发布于 2021-09-20 16:32:58
除非它被特别禁用,否则您可以尝试多路复用。这仍然是几个命令,但由于它只使用初始的主连接进行身份验证,其余的命令通过该预验证通道运行,您应该会发现它运行得更快:
# Set up master connection to target system
ssh -S "$HOME/.ssh.sock" -M -o ControlPersist=yes -fN user@server
# Perform the commands using the master connection
scp -o ControlPath="$HOME/.ssh.sock" localfile.jar user@server:path/
ssh -S "$HOME/.ssh.sock" user@server java -jar path/localfile.jar some argument >path/output.bin
# Tear down the master connection when you have finished
ssh -S "$HOME/.ssh.sock" -O exit user@server您不需要示例集中的最后一个命令,因为您的ssh命令已经将其输出放入本地文件path/output.bin。
您可以为主会话指定一个超时,这样如果您停止使用它而忘了关闭它,它将自动结束(例如,ControlPersist=60而不是ControlPersist=yes,超时一分钟)。
如果经常执行这些操作,则可能值得使用~/.ssh/ssh_config重新定义目标server的首选默认设置。
发布于 2021-09-26 12:53:49
不确定跳转到图片中的位置,但这3条命令可以通过以下方式完成:
< localfile.jar gzip -3 |
ssh user@server '
gunzip > path/localfile.jar &&
java -jar path/localfile.jar some argument | gzip -3
' | gunzip > output.bin其中,该localfile.jar是在ssh的stdin上被压缩的,它将被转发到远程外壳的stdin,最后是将其转储到远程文件中的gunzip。
类似地,java的输出在stdout上被压缩,并在本地动态解压缩以存储在本地output.bin上。
发布于 2021-09-20 12:58:43
sh+expect
sh脚本--您仍然需要输入三次密码,但与手动命令相比仍然更容易。expect并使用它来填充密码。但是这可以被认为是不安全的,因为在expect中,您必须公开地在脚本中存储密码。就我个人而言,我经常在第一个解决方案上停下来--输入我的密码几次并不难(只是很烦人)。但是如果安全环境允许的话- expect可以创造奇迹/
https://unix.stackexchange.com/questions/669824
复制相似问题