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

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

  1. 是否有可能从本地机器执行代码(如执行远程脚本的代码)? 我从来没有尝试过,也不知道如何去做。

  2. 我知道如何使用scp的大部分,所以复制不是一个问题

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

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

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

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

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

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

  1. 不是在“正常”的设置,但是如果你运行网格或集群引擎可能。 只需复制一个脚本并执行它

  2. 让脚本运行只是守护进程(使用stdin在后台运行,并redirect到/ dev / null)即

    ssh remotehost“command> / dev / null 2>&1 </ dev / null&”

如果你想等待,但做其他的东西,然后使用等待本地进程

 ssh firsthost command & ssh secondhost othercommand & ... wait 

您所描述的内容听起来相当简单(正如其他人所说的那样简单易行)。 在我的头顶上,像是:

 # 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的nrpe是否可以定期运行,或者Canonical的Landscape可以在很多服务器上运行临时的东西(其中一个主要function是部署补丁),但是它可以用于各种各样的东西 – 各种操作系统)。

HTH

C。

在你的情况下可能会有所帮助改变你的algorithm:

…连接到服务器(ssh),从中复制文件。 在服务器上执行脚本并断开连接。

如下所示:连接到服务器(ssh),从中复制文件,断开连接,后台脚本执行开始。

在这里有目标,应该很好地创build分离用户的复制目的:

 #useradd -p xxxx -d /home/username username 

接下来,在此用户的.bash_logout文件中进行一些更改:

 if [ "$SHLVL" = 1 ]; then nohup /usr/local/bin/command & fi 

继续执行此操作,为新手生成ssh密钥并以您喜欢的方式configuration远程login选项。

现在每次拷贝进程,例如scp user@host:/directory/SourceFile TargetFile都已经完成,后台任务/usr/local/bin/command应该在远程框中启动。