如何编写一个 bash 脚本,登录到另一台机器上执行操作?

如何编写一个 bash 脚本,登录到另一台机器上执行操作?

是否可以写一个 bash 脚本

  1. 将从机器 A 启动,通过 ssh 登录到不同的机器 B(机器 A 和 B 都是 Linux 机器),
  2. 将一些文件复制到机器 B 上
  3. 在这些机器上运行给定的 python 脚本。
  4. 将结果传回机器A
  5. 从机器 B 注销。

这在技术上可行吗?

答案1

当然是可行的:

scp file user@host:
ssh user@host path_to_script
scp user@host:file_to_copy ./

就是这样...

但有一个问题:您将被要求输入密码 3 次。为了避免这种情况,您可以生成 ssh 密钥并通过这些密钥对用户进行授权。

要生成 ssh 密钥,请运行ssh-keygen -t rsa、回答问题并将公钥复制到远程主机(计算机 B)以~/.ssh/authorized_keys形成文件。私钥应保存在~/.ssh/id_rsa本地计算机 (A) 上。

答案2

我可以在单个ssh连接/会话中完成所有操作:

ssh user@host "cat > remote_dst; command; cat remote_src" < local_src > local_dst

这:

  1. 复制local_srcremote_dst,
  2. 执行command,
  3. 复制remote_srclocal_dst.

但如果command写上去stdout,结果也就在local_dst。如果command从 读取输入stdin,它将接收 和EOF

答案3

虽然您可以在单个 ssh 会话中执行此操作,但将复制文件与运行命令结合起来有点棘手。

解决此任务的最简单方法是为这三个操作运行单独的 SSH 会话:

rsync -a inputs/ machineB:inputs/
ssh machineB 'some command -i inputs -o outputs'
rsync -a machineB:outputs/ outputs/

这需要向 machineB 进行 3 次身份验证。避免多次身份验证的推荐方法是使用现代版本 OpenSSH 中的连接共享工具:一劳永逸地启动到 B 的主连接,并让 SSH 自动搭载该主连接。添加ControlMaster auto一行ControlPath到您的~/.ssh/config,然后在后台启动主连接,然后执行您的任务。

ssh -fN machineB                         # start a master connection in the background
# Subsequent connections will be slaves to the existing master connection
rsync -a inputs/ machineB:inputs/
ssh machineB 'some command -i inputs -o outputs'
rsync -a machineB:outputs/ outputs/

与使用 scp 或 rsync 复制文件相比,将远程文件系统挂载在下面可能更容易SSHFS。顺便说一句,这将负责设置主连接(假设您已按照~/.ssh/config上述方式设置了连接)。

mkdir /net/machineB
sshfs machineB: /net/machineB
cp -Rp inputs /net/machineB/
ssh machibeB 'some command -i inputs -o outputs'
cp -Rp /net/machineB/outputs .

相关内容