我正在考虑编写一个自动脚本,连接到服务器(ssh),从中复制文件。在服务器上执行脚本并断开连接。
是否可以让脚本从本地机器执行代码(如执行远程脚本的代码)?我从未尝试过,也不知道该怎么做。
我理解如何使用 scp,因此复制不是问题
完成 1 之后,我想知道如何等待远程脚本完成,并可能偶尔执行脚本,但断开连接并让脚本在服务器上运行。我该怎么做?(这应该在单独的问题中)
答案1
A1)在远程服务器上执行命令:
ssh server "/usr/local/sbin/command"
使用此方法,ssh 会话将等待前台进程退出。
A3)要在远程服务器上运行后台进程:
ssh server "nohup /usr/local/sbin/command &"
答案2
在“正常”设置中不是这样,但如果您运行网格或集群引擎,则可能实现。只需复制脚本并执行它即可。
要让脚本继续运行,只需将其设为守护进程(在后台运行,stdin 和 out 重定向到 /dev/null)即可
ssh remotehost “命令 > /dev/null 2>&1 < /dev/null &”
如果你想等待但做其他事情,那么使用等待就像本地进程一样
ssh firsthost command &
ssh secondhost othercommand &
...
wait
答案3
在你的情况下改变你的算法可能会有用:
...连接到服务器(ssh),从中复制文件。在服务器上执行脚本并断开连接。
如下:连接到服务器(ssh),从中复制文件,断开连接,开始后台脚本执行。
为了在这里达到目标,最好为复制目的创建单独的用户:
#useradd -p xxxx -d /home/username username
接下来,对该用户的.bash_logout
文件进行一些更改:
if [ "$SHLVL" = 1 ]; then
nohup /usr/local/bin/command &
fi
继续此操作,为新手生成 ssh 密钥并按照您喜欢的方式配置远程登录选项。
现在,每次scp user@host:/directory/SourceFile TargetFile
完成复制过程时,/usr/local/bin/command
都应在远程箱中启动后台任务。
答案4
您所描述的听起来相当简单(而且正如其他人所说,很容易实现)。我首先想到的是:
# with a file named after each node:
SERVERS=`ls /etc/cluster/members`
THIS_NODE=`uname -n`
REMOTE_NAME="/var/cluster/incoming/${THIS_NODE}_$$"
for (i in ${SERVERS}); do
scp $1 ${i}:${REMOTE_NAME}
ssh ${i} "bash ${REMOTE_NAME}"
done
然而,当您深入了解可能涉及的细节并使用多台服务器时,问题很快就会变得非常复杂。
你可能想看看核聚变使用 Nagios 来定期运行某些东西,或者使用 Canonical 的景观用于在许多服务器上运行临时的东西(它的一个主要功能是部署补丁 - 但它可以用于各种各样的事情 - 以及各种操作系统)。
高血压
C。