我厌倦了这样做。
ssh me@somehost.com
input my password
sudo su - someuser
input my password
cd /some/working/directory
<run some commands>
有没有自动化这个?我需要一个特殊的外壳吗?还是shell模拟器?我能以编程方式将shell驱动到某个点然后在其上运行手动命令吗?
在python中编程的额外点数是为了获得额外的黑客善意
编辑:以下所有答案都集中在问题的“完全自动化”部分:困难部分是我在上面突出显示的部分。这是另一个例子,看看我是否可以捕捉到本质。
ssh me@somehost.com
<get a shell because keys are setup>
sudo su - user_that_deploys_the_app
<input password, because we don't want to give passwordless sudo to developers>
cd env; source bin/activate
cd /path/where/ur/app/is/staging
<edit some files, restart the server, edit some more, check the logs, etc.>
exit the term
答案 0 :(得分:2)
对于ssh /身份验证,您可以setup passwordless authentication by using keys。然后,您只需使用ssh
和bash脚本以自动方式执行一系列命令。
你可以在这里使用Python,但是如果你正在执行一系列shell命令,那么使用shell脚本可能更好一点,因为这正是他们所做的。
或者,请查看Fabric以了解您的自动化需求。它是基于Python的,你的“食谱”是用Python编写的。
答案 1 :(得分:1)
我不太确定你在问什么,但你可能要问的是使用公钥让SSH在无密码模式下工作。一般的想法是生成SSH密钥对:
ssh-keygen -t rsa
为您提供id_rsa
和id_rsa.pub
。您将id_rsa.pub
的内容附加到目标用户的~/.ssh/authorized_keys
文件中,从那时起SSH将不会要求提供凭据。在您的示例中,这将适用于:
只有一次
# On your source machine
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub
# Copy this to clip board
# On somehost.com
su - someuser
# edit ~/.ssh/authorized_keys and paste what you had copied from previous step
从现在开始,您现在可以运行
ssh someuser@somehost.com "sh -c 'cd /some/dir; command.sh'"
并且不会提示输入凭据。
答案 2 :(得分:1)
答案 3 :(得分:1)
您可以使用autoexpect
。它创建expect
脚本(用于处理与用户交互的脚本语言)。运行
autoexpect ssh me@somehost.com
然后是其余命令。将创建脚本script.exp
。
请注意,脚本会记录输入和输出的确切结果。如果输出可能因执行而异,则需要修改位生成的脚本。
答案 4 :(得分:0)
正如丹尼尔指出的那样,你需要有一种安全的方法来对盒子做ssh和sudo。这些项目对于处理linux / unix盒子是通用的。解决之后,您可以使用fabric。它是一个基于python的自动化工具。
答案 5 :(得分:0)
您可以在~/.ssh/config
中设置内容
例如:
Host somehost
User test
有关详细信息,请参阅ssh_config(5)。
接下来,您可以使用ssh-keygen(1)生成SSH密钥,运行ssh-agent(1),并将其用于身份验证。
如果要在远程计算机上运行命令,可以使用以下内容:
$ ssh somehost "sh myscript.sh ${myparameter}"
。
我希望这至少能指出你正确的方向:)
如果您需要 sudo访问权限,那么就存在明显的潜在安全问题......但您可以在ChrootDirectory
块内的每个用户基础上使用Match
。有关信息,请参阅sshd_config(5)。
答案 6 :(得分:0)
尝试模块paramiko。这可以满足您的要求。