在本地机器上执行 bash 来在远程进行工作?

在本地机器上执行 bash 来在远程进行工作?

我正在考虑编写一个自动脚本,连接到服务器(ssh),从中复制文件。在服务器上执行脚本并断开连接。

  1. 是否可以让脚本从本地机器执行代码(如执行远程脚本的代码)?我从未尝试过,也不知道该怎么做。

  2. 我理解如何使用 scp,因此复制不是问题

  3. 完成 1 之后,我想知道如何等待远程脚本完成,并可能偶尔执行脚本,但断开连接并让脚本在服务器上运行。我该怎么做?(这应该在单独的问题中)

答案1

A1)在远程服务器上执行命令:

ssh server "/usr/local/sbin/command"

使用此方法,ssh 会话将等待前台进程退出。

A3)要在远程服务器上运行后台进程:

ssh server "nohup /usr/local/sbin/command &"

答案2

  1. 在“正常”设置中不是这样,但如果您运行网格或集群引擎,则可能实现。只需复制脚本并执行它即可。

  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。

相关内容