user5967 Asked: 2009-07-15 10:23:54 +0800 CST2009-07-15 10:23:54 +0800 CST 2009-07-15 10:23:54 +0800 CST scp 后 sudo 到超级用户 772 为了将代码部署到服务器,我运行了一个脚本,该脚本使用我的 private key 将部署文件 scp 部署到服务器上。但是在 scp 之后,我必须手动 ssh 到机器 sudo 到超级用户帐户并运行部署脚本。 我也想自动化第二步,但不知道怎么做。 这两个步骤过程的任何其他替代方案? sudo scp 6 个回答 Voted Best Answer MikeyB 2009-07-15T10:34:20+08:002009-07-15T10:34:20+08:00 如果控制 sudoers 文件的人将更改它,以便您可以在没有密码的情况下运行某些命令,那么它将像运行一样简单: $ ssh other-host sudo /path/to/deployment.script 如果没有,那么您可以让 sudo 从文件中获取其输入: $ ssh other-host 'sudo -S /path/to/deployment.script < password.file' 但是,不要这样做,因为这意味着您将密码放入文件中。服务器管理员应该为此踢你的屁股。 比上述所有方法更好的选择是让服务器管理员在 root 的 authorized_keys 文件中设置一个条目,该条目只允许运行部署脚本。这样,要运行脚本,您只需使用特殊密钥以 root 身份 ssh 进入服务器。 Will 2009-07-15T10:47:54+08:002009-07-15T10:47:54+08:00 为此目的在远程主机上创建一个密钥对,将其添加到您要部署到的服务器上的 root 授权密钥文件中。在 key 前面添加 '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 进行设置 command="scp -t /destination/directory/;deploy_script.sh",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-dss xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx user@remote_server 如果您无法访问 root 的 authorized_keys2 文件,请将其与无密码的 sudo 结合使用。如果不允许使用 ssh、scp 和期望。 theotherreceive 2009-07-15T10:32:12+08:002009-07-15T10:32:12+08:00 您可以使用某种基于 cron 的解决方案相当轻松地做到这一点 #!/bin/bash if [ -f /path/to/deployment.script ]; then mv /path/to/deployment.script /path/to/somewhere/else do_deployment fi 每隔几分钟从 cron 以 root 身份运行一次这样的脚本应该可以满足您的需要。可能有一种更优雅的方法可以做到这一点,但这是我想到的最简单/最快的方法。 freiheit 2009-07-15T11:17:44+08:002009-07-15T11:17:44+08:00 我认为您最好的解决方案是与实际控制服务器的人讨论此事。这些解决方案都可能违反某种安全策略或需要您可能无权进行的更改。基本上,听起来政策是,要以 root 身份运行某些东西,您每次都需要输入密码。 但是,这是一个可以工作的本地 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 读取密码。 然后只需deploy_bypassing_security在 CLI 上运行。第一次运行时,它会在执行任何其他操作之前要求输入密码,然后下一次它只是在没有提示的情况下运行。您可能需要ssh username@remotehost sudo -k在 scp 之后添加一个“”。 Zenham 2009-07-15T11:04:45+08:002009-07-15T11:04:45+08:00 我建议使用像 Chef 或 Puppet 这样的东西来处理这个问题,因为它们可能会比你手动处理的方法更安全。 Kyle Brandt 2009-07-15T11:48:32+08:002009-07-15T11:48:32+08:00 您可以执行以下操作来复制文件,然后在复制文件后运行命令,所有这些都在一个 ssh 命令中: cat testfile | ssh root@superServer 'dd of=/home/testcopy; chown root/home/testcopy; chmod o+rx /home/testcopy; sudo /home/testcopy' 我确实认为您可能需要无密码的 sudo 来解决这个问题……但不确定。
如果控制 sudoers 文件的人将更改它,以便您可以在没有密码的情况下运行某些命令,那么它将像运行一样简单:
如果没有,那么您可以让 sudo 从文件中获取其输入:
但是,不要这样做,因为这意味着您将密码放入文件中。服务器管理员应该为此踢你的屁股。
比上述所有方法更好的选择是让服务器管理员在 root 的 authorized_keys 文件中设置一个条目,该条目只允许运行部署脚本。这样,要运行脚本,您只需使用特殊密钥以 root 身份 ssh 进入服务器。
为此目的在远程主机上创建一个密钥对,将其添加到您要部署到的服务器上的 root 授权密钥文件中。在 key 前面添加 '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 进行设置
command="scp -t /destination/directory/;deploy_script.sh",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-dss xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx user@remote_server
如果您无法访问 root 的 authorized_keys2 文件,请将其与无密码的 sudo 结合使用。如果不允许使用 ssh、scp 和期望。
您可以使用某种基于 cron 的解决方案相当轻松地做到这一点
每隔几分钟从 cron 以 root 身份运行一次这样的脚本应该可以满足您的需要。可能有一种更优雅的方法可以做到这一点,但这是我想到的最简单/最快的方法。
我认为您最好的解决方案是与实际控制服务器的人讨论此事。这些解决方案都可能违反某种安全策略或需要您可能无权进行的更改。基本上,听起来政策是,要以 root 身份运行某些东西,您每次都需要输入密码。
但是,这是一个可以工作的本地 shell 函数:
如果没有密码,它会要求您输入密码(因此您必须第一次正确输入!)然后将该密码回显到 sudo,告诉 sudo 从 stdin 而不是通过 tty 读取密码。
然后只需
deploy_bypassing_security
在 CLI 上运行。第一次运行时,它会在执行任何其他操作之前要求输入密码,然后下一次它只是在没有提示的情况下运行。您可能需要ssh username@remotehost sudo -k
在 scp 之后添加一个“”。我建议使用像 Chef 或 Puppet 这样的东西来处理这个问题,因为它们可能会比你手动处理的方法更安全。
您可以执行以下操作来复制文件,然后在复制文件后运行命令,所有这些都在一个 ssh 命令中:
我确实认为您可能需要无密码的 sudo 来解决这个问题……但不确定。