是否可以写一个 bash 脚本
- 将从机器 A 启动,通过 ssh 登录到不同的机器 B(机器 A 和 B 都是 Linux 机器),
- 将一些文件复制到机器 B 上
- 在这些机器上运行给定的 python 脚本。
- 将结果传回机器A
- 从机器 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
这:
- 复制
local_src
到remote_dst
, - 执行
command
, - 复制
remote_src
到local_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 .