gpt4 book ai didi

shell - 在 Shell 脚本中设置和使用 SSH ControlMaster session

转载 作者:行者123 更新时间:2023-12-01 11:39:45 24 4
gpt4 key购买 nike

我正在编写一个脚本,其中包含需要在远程服务器上运行的几组命令,并在其间处理结果。目前这是通过运行 ssh 来实现的。对于每组命令,但是这需要每次建立和验证新连接,这很慢。

我最近读到了 ControlMaster SSH 中的选项,这似乎正是我所需要的,即能够通过单个 SSH 连接运行单独的 SSH session 。

但是,我非常不清楚的是我将如何在我的 shell 脚本中实现这一点。例如,我正在考虑像这样构建它:

#!/bin/sh
HOST="$1"

# Make sure we clean up after ourselves
on_complete() {
kill $ssh_control_master_id
rm -r "$tmp_dir"
}
trap 'on_complete 2> /dev/null' SIGINT SIGHUP SIGTERM EXIT

tmp_dir=$(mktemp -d "/tmp/$(basename "$0").XXXXXX")
ssh_control_socket="$tmp_dir/ssh_control_socket"

# Setup control master
ssh -o 'ControlMaster=yes' -S "$ssh_control_socket" "$HOST" &
ssh_control_master_id=$!

# Run initial commands
data=$(ssh -S "$ssh_control_socket" "$HOST" 'echo "Foo"')

# Process the data
echo "$data"

# Run some more commands
data=$(ssh -S "$ssh_control_socket" "$HOST" 'echo "Bar"')

# Process the second batch of data
echo "$data"

只是一个简单的例子给你一个想法,但这似乎不是正确的方法,因为运行它会导致第二个 ssh命令挂起,或者每个命令将正常运行(创建自己的连接)。我也不确定如何等待建立主连接,即 - 我可能正在运行我的实际命令,而远程连接仍在建立中。

同样在相关说明中,一旦控制主机运行,关闭它的正确方法是什么,是否可以杀死它和/或删除它的套接字?

最佳答案

你的代码看起来不错。我还没有测试过,但第一个尝试使用主连接的进程可能应该阻塞,直到主连接实际成功建立。您可以使用 -N避免在主连接上运行虚假 shell 的选项:

ssh -N -o 'ControlMaster=yes' -S "$ssh_control_socket" "$HOST" &

简单地杀死 ssh 完全没问题一旦所有从属 session 都完成,就进行处理。

关于shell - 在 Shell 脚本中设置和使用 SSH ControlMaster session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22411932/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com