如何自动化终端命令?

时间:2011-03-24 20:36:00

标签: python linux macos shell ssh

我厌倦了这样做。

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

7 个答案:

答案 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_rsaid_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)

正如其他人所指出的,织物是一个不错的选择。还有pexpect可能更符合您的要求。

答案 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。这可以满足您的要求。