我有一个webservice运行在多个不同的远程redhat机器上。 每当我想更新服务,我会同步从版本控制库(我使用perforce)在Perl中编写新的Web服务源代码,并使用新的同步下来的Perl代码重新启动服务。 我觉得一个一个地login到远程机器,做一连串的命令来重新启动服务是无聊的。 所以我写下了如下的bash脚本update.sh,以便“一次做一个地方,更新所有机器”。 我将在本地机器上运行这个shell脚本。 但似乎不起作用。 它只执行第一个命令“sudo -u webservice_username -i”,我可以从我的本地机器的命令行中看到。 (下面的代码只显示了它将如何更新一个远程web服务,“export P4USER = myname”是perforce客户端的用法)
#!/bin/sh ssh myname@remotehost1 'sudo -u webservice_username -i ; export P4USER=myname; cd dir ; p4 sync ; cd bin ; ./prog --domain=config_file restart ; tail -f ../logs/service.log'
为什么我知道唯一的第一个命令是执行? 那么因为在我的本地机器上inputssh的密码后,它显示:
Your environment has been modified. Please check /tmp/webservice.env.
它只是卡在那里。 我的意思是没有回报。
正如评论者所build议的,我为ssh添加了“-t”
#!/bin/sh ssh -t myname@remotehost1 'sudo -u webservice_username -i ; export P4USER=myname; cd dir ; p4 sync ; cd bin ; ./prog --domain=config_file restart ; tail -f ../logs/service.log'
这将让本地命令行返回。 但似乎很奇怪,它不能cd到该“目录”,它说:“CD:DIR:没有这样的文件或目录”它也说“P4:命令未find”。 所以看起来像sudo -u命令执行时没有任何效果,导出命令没有执行或执行无效。
详细的本地日志文件如下所示:
Your environment has been modified. Please check /tmp/dir/.env. bash: line 0: cd: dir: No such file or directory bash: p4: command not found bash: line 0: cd: bin: No such file or directory bash: ./prog: No such file or directory tail: cannot open `../logs/service.log' for reading: No such file or directory tail: no files remaining
而不是通过SSH连接,然后立即改变用户,你不能使用像ssh -t webservice_username@remotehost1
连接所需的用户名开始? 这将避免需要完成任务。
如果这是不可能的,请尝试将所有要在shell脚本中运行的命令包装起来,并将其存储在远程计算机上。 如果你可以通过脚本来完成你的任务,那么你的ssh
调用会变得更简单,并且会遇到更少的问题:
ssh myname@remotehost1 '/path/to/script'
为了方便更新这个脚本,你可以为本地机器编写一个简短的脚本,通过scp
上传最新的版本,然后使用ssh
来调用它。
请注意,当您运行:
#!/bin/sh ssh myname@remotehost1 'sudo -u webservice_username -i ; export P4USER=myname; cd dir ; p4 sync ; cd bin ; ./prog --domain=config_file restart ; tail -f ../logs/service.log'
你的SSH会话运行sudo -u webservice_username -i
等待它退出,然后运行其余的命令; 它不执行sudo
,然后运行下面的命令。 这与你运行一系列命令的上下文有关。 所有的命令都在myname@remotehost1
的shell中执行,并且所有的sudo -u webservice_username - i
都启动了一个webservice_username的shell,并且实际上并没有运行任何命令。
真的,这里最好的解决方案就像bta说的。 编写一个脚本,然后rsync / scp到目的地,然后使用sudo
运行。
导出命令根本就不用这样的SSH工作,你想要做的是远程修改〜/ .bashrc,它会在每次你做ssh登录时自己来源。