我是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正在运行,之后没有显示任何内容。
答案 0 :(得分:1)
您需要将脚本的重置作为参数传递给SSH。试试这种格式:
SCRIPT="sudo su; command1; command2; command3;"
ssh -i permissions.pem ubuntu@ip $SCRIPT
请参阅:http://linuxcommand.org/man_pages/ssh1.html
希望这有帮助。
<强>更新强> 你在运行命令后没有看到任何内容的原因是因为sudo需要密码。为避免这种情况,有三种解决方案:
ubuntu
用户所需的权限,以执行脚本中的所有任务。echo 'password' | sudo su; ...
ubuntu
用户sudo
,而不提示输入密码。运行sudo visudo
并添加以下行:ubuntu ALL = NOPASSWD : ALL
每个系统管理员都会采用不同的方法解决此问题。我想每个人都会同意option 2
是最不安全的。重置是有争议的。我认为option 3
稍微安全一些。但是,如果您的密钥被泄露,整个服务器都会受到损害。最安全的是option 1
。虽然分配个人权限很痛苦,但这样做会限制您在分配权限时的风险,以防您的密钥被泄露。
还有一个注意事项: 将;
替换为&&
中的SCRIPT
可能会有所帮助。通过这样做,您将确保第二个命令仅在第一个命令成功完成时运行,第三个命令仅在第二个命令成功完成时运行,依此类推。