scp+ssh+scp 在单个连接中

scp+ssh+scp 在单个连接中

我不知道术语,但基本上我们的公司环境是使用跳转主机设置的,因此创建 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

就是这样。有办法吗? (服务器无法访问我的本地计算机,但这也许是显而易见的。)谢谢!

答案1

除非它被特别禁用,否则您可以尝试多路复用。这仍然是几个命令,但由于它仅使用初始主连接进行身份验证,其余命令在该预身份验证的通道上运行,您应该会发现它运行得更快:

# 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

答案2

不确定在哪里跳转主机落入你的图片中,但这 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在 的 stdin 上被压缩ssh,将被转发到远程 shell 的 stdin,并最终gunzip将其转储到远程文件中。

类似地, 的输出java在 stdout 上压缩发送,并在本地即时解压缩以存储在本地output.bin

答案3

嘘+期待

  1. 按原样使用所有三个命令编写一个sh脚本 - 您仍然需要输入密码三次,但与手动命令相比仍然更容易。

  2. 有了脚本后,您就可以使用它expect并用它填充密码。但这可能被认为是不安全的,因为expect您必须在脚本中公开存储密码。

就我个人而言,我经常停止第一个解决方案 - 多次输入密码并不难(只是烦人)。但如果安全环境允许 -expect可以创造奇迹/

相关内容