linux – 如何编写一个bash shell脚本来ssh到远程机器并更改用户并导出一个env变量并执行其他命令

我有一个在多个不同的远程redhat机器上运行的web服务.每当我想要更新服务时,我将从版本控制库(我使用perforce)同步下来用perl编写的新web服务源代码,并使用新的同步下行perl代码重新启动服务.我认为一个接一个地登录远程机器并执行一系列命令以逐个重新启动服务实在太无聊了.所以我写了一个像下面这样的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'

为什么我知道唯一的第一个命令被执行?好吧,因为我在本地机器上输入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:没有这样的文件或目录”它也说“p4:command not found”.所以看起来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这样的东西来连接所需的用户名吗?这样就可以避免完全放弃sudo.

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

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

为了便于更新此脚本,您可以为本地计算机编写一个简短脚本,通过scp上载最新版本,然后使用ssh调用它.

上一篇:1. Linux常见的文件管理命令.


下一篇:如何设置R的环境变量以在RedHat Linux(RHEL6)上的Tomcat中使用