4

我有一个在多个不同的远程 redhat 机器上运行的 web 服务。每当我想更新服务时,我都会从版本控制库(我使用 perforce)同步使用 perl 编写的新 Web 服务源代码,并使用新同步的 perl 代码重新启动服务。我觉得一个一个地登录到远程机器上然后手动执行那一系列命令来一个一个地重启服务太无聊了。所以我写了一个 bash 脚本 update.sh 如下所示,以便“一次在一个地方执行,更新所有机器”。我将在我的本地机器上运行这个 shell 脚本。但它似乎不起作用。它只执行第一个命令“sudo -u webservice_username -i”,我可以从本地机器的命令行中看出这一点。(下面的代码仅显示了它将如何更新远程 Web 服务之一。“

#!/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 的密码后,它显示:

Your environment has been modified. Please check /tmp/webservice.env.

它只是卡在那里。我的意思是没有回报。

根据评论员的建议,我为 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 到那个“dir”,它说“cd:dir: No such file or directory”它还说“p4: command not found”。所以看起来 sudo -u 命令执行没有效果,而 export 命令没有执行或执行没有效果。
详细的本地日志文件如下:

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
4

3 回答 3

3

与其通过 ssh 连接然后立即更改用户,不如先使用ssh -t webservice_username@remotehost1所需的用户名连接吗?那将sudo完全避免需要。

如果这不可能,请尝试将您要运行的所有命令封装在一个 shell 脚本中并将其存储在远程计算机上。如果您可以从脚本中完成任务,那么您的ssh调用会变得更加简单,并且应该会遇到更少的问题:

ssh myname@remotehost1 '/path/to/script'

为了轻松更新此脚本,您可以为本地计算机编写一个简短的脚本,通过它上传最新版本scp,然后使用ssh它来调用它。

于 2012-06-13T18:46:55.810 回答
0

导出命令根本无法像这样使用 ssh,您要做的是远程修改 ~/.bashrc,并且每次您进行 ssh 登录时它都会自行获取。

于 2013-04-04T04:29:25.143 回答
0

请注意,当您运行时:

#!/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,然后运行以下命令。这与您运行一系列命令的上下文有关。所有命令都在 shell 中执行,myname@remotehost1并且所有命令都sudo -u webservice_username - i为 webservice_username 启动一个 shell,实际上并不运行任何命令。

真正最好的解决方案就像 bta 所说的那样;编写一个脚本,然后将其 rsync/scp 到目的地,然后使用sudo.

于 2012-06-13T19:07:32.563 回答