繁体   English   中英

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

[英]how to write a bash shell script to ssh to remote machine and change user and export a env variable and do other commands

我有一个在多个不同的远程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调用它。

请注意,当您运行时:

#!/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运行它。

export命令根本就没有像这样使用ssh,你要做的是远程修改〜/ .bashrc,它会在你每次使用ssh登录时自行获取。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM