Shell脚本在本地和远程计算机上运行

时间:2016-12-13 05:49:24

标签: bash shell ubuntu

我是shell脚本的新手,
我正在尝试编写一个在本地计算机上运行的脚本。

它的命令很少在我的本地运行,然后在远程服务器上运行。

以下是示例脚本 -
前两个将在我的本地系统上运行,
其余的都是在远程服务器上运行。

例如 -

scp -i permissions.pem someJar.jar ubuntu@ip:/var/tmp
ssh -i permissions.pem ubuntu@ip
sudo su
service someService stop
rm -rf /home/ubuntu/someJar.jar
rm -rf /home/ubuntu/loggingFile.log
mv /var/tmp/someJar.jar .
service someService start

由于脚本将在我的本地机器上运行,所以 如何确保第3个和更多命令在远程服务器上而不是在我的机器上生效?

这是我的sample.sh档案 -

scp -i permissions.pem someJar.jar ubuntu@ip:/var/tmp
SCRIPT="sudo su; ps aux | grep java; service someService stop; ps aux | grep java; service someService start; ps aux | grep java;"
ssh -i permissions.pem ubuntu@ip $SCRIPT

scp正在运行,之后没有显示任何内容。

1 个答案:

答案 0 :(得分:1)

您需要将脚本的重置作为参数传递给SSH。试试这种格式:

SCRIPT="sudo su; command1; command2; command3;"
ssh -i permissions.pem ubuntu@ip $SCRIPT

请参阅:http://linuxcommand.org/man_pages/ssh1.html

希望这有帮助。

<强>更新 你在运行命令后没有看到任何内容的原因是因为sudo需要密码。为避免这种情况,有三种解决方案:

  1. 授予ubuntu用户所需的权限,以执行脚本中的所有任务。
  2. 在SCRIPT:echo 'password' | sudo su; ...
  3. 下将密码传递给sudo
  4. 修改sudo-er文件并允许ubuntu用户sudo,而不提示输入密码。运行sudo visudo并添加以下行:ubuntu ALL = NOPASSWD : ALL
  5. 每个系统管理员都会采用不同的方法解决此问题。我想每个人都会同意option 2是最不安全的。重置是有争议的。我认为option 3稍微安全一些。但是,如果您的密钥被泄露,整个服务器都会受到损害。最安全的是option 1。虽然分配个人权限很痛苦,但这样做会限制您在分配权限时的风险,以防您的密钥被泄露。

    还有一个注意事项: ;替换为&&中的SCRIPT可能会有所帮助。通过这样做,您将确保第二个命令仅在第一个命令成功完成时运行,第三个命令仅在第二个命令成功完成时运行,依此类推。