Linux 如何将bashshell脚本写入ssh到远程计算机,并更改用户和导出env变量以及执行其他命令

Linux 如何将bashshell脚本写入ssh到远程计算机,并更改用户和导出env变量以及执行其他命令,linux,bash,ssh,perforce,redhat,Linux,Bash,Ssh,Perforce,Redhat,我有一个在多台不同的远程redhat机器上运行的Web服务。每当我想更新服务时,我都会同步从版本控制库(我使用perforce)用perl编写的新webservice源代码,并使用新的同步perl代码重新启动服务。我认为一个接一个地登录到远程机器并手动一个接一个地执行一系列命令来重新启动服务太无聊了。所以我编写了一个bash脚本update.sh,如下所示,目的是“一次一个地方,更新所有机器”。我将在本地计算机上运行此shell脚本。但这似乎行不通。它只执行第一个命令“sudo-uwebserv

我有一个在多台不同的远程redhat机器上运行的Web服务。每当我想更新服务时,我都会同步从版本控制库(我使用perforce)用perl编写的新webservice源代码,并使用新的同步perl代码重新启动服务。我认为一个接一个地登录到远程机器并手动一个接一个地执行一系列命令来重新启动服务太无聊了。所以我编写了一个bash脚本update.sh,如下所示,目的是“一次一个地方,更新所有机器”。我将在本地计算机上运行此shell脚本。但这似乎行不通。它只执行第一个命令“sudo-uwebservice\uusername-i”,我可以从本地机器的命令行看出这一点。(下面的代码仅显示它将如何更新其中一个远程Web服务。“export P4USER=myname”用于perforce客户端)

为什么我知道只有第一个命令被执行?因为在本地机器上输入ssh的密码后,它会显示:

Your environment has been modified. Please check /tmp/webservice.env.
它只是卡在那里。我的意思是没有回报

正如一位评论员所建议的,我为ssh添加了“-t”

这将允许本地命令行返回。但它看起来很奇怪,它不能cd到那个“目录”,它说“cd:dir:没有这样的文件或目录”,它还说“p4:找不到命令”。因此,看起来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

您不能使用类似
ssh-twebservice的东西,而不是通过ssh连接然后立即更改用户吗_username@remotehost1
要以所需的用户名开始连接?这将避免完全需要
sudo

如果不可能,请尝试将要在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-uwebservice\uusername-i
等待退出,然后运行其余命令;它不会执行
sudo
,然后运行以下命令。这与运行一系列命令的上下文有关。所有命令都在
shell中执行myname@remotehost1
和all
sudo-uwebservice\u username-i
都是为webservice\u username启动一个shell,实际上不运行任何命令


实际上,这里最好的解决方案正如bta所说;编写一个脚本,然后rsync/scp将其发送到目标,然后使用
sudo

export命令运行该脚本,而不是像这样使用ssh,您要做的是远程修改~/.bashrc,它将在您每次进行ssh登录时自动生成源代码。

您是否有
sudo
设置以不要求您输入密码?@chrisaycock您是对的。如果我通过登录到远程机器手动执行这一系列命令,并执行第一个命令“sudo-uwebservice\uusername-I”,则不需要密码。知道如何更改shell脚本吗?不要在ssh后运行sudo,而是将用户myname添加到sudoers文件中,该文件具有在服务器上运行脚本所需的权限。@nathancahill我将sudo更改为其他用户的原因不是权限问题。只有webservice_用户具有“dir”目录。这台机器上的每个用户都有不同的工作环境,因此有不同的目录文件夹。您是否尝试过
ssh-t
-t
?有没有办法让sudo-u命令正常执行,而让其余命令执行?没有给出您想要完成的任务;在本例中,作为特定用户运行多个命令最好使用脚本。我查看了sudo的文档,没有找到任何有用的东西。
ssh myname@remotehost1 '/path/to/script'
#!/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'