为了将代码部署到服务器上,我使用我的私钥将一个脚本(scp的部署文件)运行到服务器上。 但是在scp之后,我必须手动ssh到sudo机器才能使用超级用户帐户并运行一个部署脚本。
我想自动化第二步,但不知道如何。
这两个步骤过程的任何其他select?
如果控制sudoers文件的人会改变它,这样你就可以不用密码就可以运行某些命令,它就像运行一样简单:
$ ssh other-host sudo /path/to/deployment.script
如果没有,那么你可以让sudo从文件中input:
$ ssh other-host 'sudo -S /path/to/deployment.script < password.file'
但是,不要这样做,因为这意味着你把你的密码放到一个文件中。 而服务器pipe理员应该踢你的屁股。
比上述所有更好的select是让服务器pipe理员在root的authorized_keys文件中build立一个只允许运行部署脚本的条目。 这样,要运行脚本,只需要用特殊的密钥以root身份login到服务器。
为此,在远程主机上创build一个密钥对,将其添加到您正在部署到的服务器上的根授权密钥文件中。 在密钥前添加“command =”cat – >> file.name; deploy_script.sh“,no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty'在远程主机上运行“cat / path / to / file | ssh -i / path / to / key”
您也可以使用授权密钥文件中的以下内容通过scp进行设置
命令=“SCP -t /destination/directory/;deploy_script.sh",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty SSH-DSS xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx用户@ remote_server的
如果您无法访问root的authorized_keys2文件,请将它与密码较less的sudo结合使用。 如果不允许使用ssh,scp和expect。
你可以用一些基于cron的解决scheme很容易地做到这一点
#!/bin/bash if [ -f /path/to/deployment.script ]; then mv /path/to/deployment.script /path/to/somewhere/else do_deployment fi
每隔几分钟从cron运行一个脚本就可以做你需要的东西。 有可能是一个更优雅的方式来做到这一点,但这是最简单/最快的想到。
我认为你最好的解决办法是与任何实际控制服务器的人讨论这个问题。 这些解决scheme都可能违反某种安全策略,或者需要您可能无权授予的更改。 基本上,听起来像政策是,以root身份运行的东西,你需要每次input你的密码。
但是,下面是一个可以工作的本地shell函数:
deploy_bypassing_security () { if [ -z "$REMOTEPASSWORD" ]; then read -s -p "Password: " REMOTEPASSWORD fi scp deployment_file username@remotehost echo $REMOTEPASSWORD | ssh -t username@remotehost sudo -S deployment_script }
如果没有密码的话,会询问你的密码(所以你必须在第一时间把它弄好),然后把这个密码回显给sudo,告诉sudo从stdin而不是通过tty读取密码。
然后在CLI上运行deploy_bypassing_security 。 第一次运行它之前要求input密码,然后下一次运行时没有提示。 您可能需要在scp之后添加“ ssh username@remotehost sudo -k ”。
我build议使用像厨师或木偶这样的东西来处理这个问题,因为他们可能比你手工处理的方法更安全。
您可以执行如下操作来复制文件,然后在复制文件后运行命令,全部在一个ssh命令中执行:
cat testfile | ssh root@superServer 'dd of=/home/testcopy; chown root/home/testcopy; chmod o+rx /home/testcopy; sudo /home/testcopy'
我认为你可能需要无密码的sudo,虽然…不知道。