我正在考虑编写一个连接到服务器(ssh)的自动脚本,从中复制文件。 在服务器上执行脚本并断开连接。
是否有可能从本地机器执行代码(如执行远程脚本的代码)? 我从来没有尝试过,也不知道如何去做。
我知道如何使用scp的大部分,所以复制不是一个问题
做完1后,我想知道如何等待远程脚本完成,也许偶尔执行脚本,但断开连接,并使脚本在服务器上运行。 我怎么做? (这应该是在一个单独的问题)
A1)在远程服务器上执行命令:
ssh server "/usr/local/sbin/command"
使用这个方法,ssh会话将等待前台进程退出。
A3)在远程服务器上运行后台进程:
ssh server "nohup /usr/local/sbin/command &"
不是在“正常”的设置,但是如果你运行网格或集群引擎可能。 只需复制一个脚本并执行它
让脚本运行只是守护进程(使用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应该在远程框中启动。