【问题标题】:How can you automate terminal commands?如何自动化终端命令?
【发布时间】:2026-02-16 05:25:01
【问题描述】:

我厌倦了这样做。

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

【问题讨论】:

  • 你能扩展你的问题吗?什么终端命令?适用于哪个操作系统?什么样的自动化?用例?
  • 我肯定会尝试一些甜美的日本机器人。
  • 离题 - 移至服务器故障
  • @CarlosZ 起始操作系统将是 mac,目标是任何你可以通过 ssh 进入的操作系统。用例是停止重复的事情,自动化的类型将是到这个盒子做这个,然后到另一个盒子做那个。

标签: python linux macos shell ssh


【解决方案1】:

对于 ssh/身份验证部分,您可以setup passwordless authentication by using keys。然后,您可以简单地使用ssh 和 bash 脚本以自动方式执行一系列命令。

可以在这里使用 Python,但如果您正在执行一系列 shell 命令,那么使用 shell 脚本可能会更好,因为它们正是这样做的。

或者,查看Fabric 以满足您的自动化需求。它是基于 Python 的,您的“食谱”是用 Python 编写的。

【讨论】:

  • -c 标志用于:“选择加密会话的密码规范。” 根据 ssh 手册页...您不需要任何标志或选项,只需使用ssh myhost "command" ...参见 ssh(1)...
  • @Carpet 是的,我刚刚意识到我和sh -c 混淆了,你根本不需要争论,编辑了
  • 是的,有时会让人感到困惑 :)
  • 你不能在一个结构脚本中间停下来运行一些手动命令然后继续。
【解决方案2】:

正如 Daniel 指出的那样,您需要有一种安全的方式在盒子上执行 ssh 和 sudo。这些项目对于处理 linux/unix 盒子是通用的。一旦你解决了这个问题,你就可以使用fabric。这是一个基于 python 的自动化工具。

【讨论】:

    【解决方案3】:

    您可以在~/.ssh/config 中设置内容 例如:

    Host somehost
        User test
    

    有关详细信息,请参阅 ssh_config(5)。

    接下来,您可以使用 ssh-keygen(1) 生成 SSH 密钥,运行 ssh-agent(1),并将其用于身份验证。

    如果你想在远程机器上运行命令,你可以使用类似的东西:

    $ ssh somehost "sh myscript.sh ${myparameter}".

    我希望这至少可以为您指明正确的方向:)

    如果您需要 sudo 访问权限,那么尽管存在明显的潜在安全问题......您可以在Match 块内按每个用户使用ChrootDirectory。有关信息,请参阅 sshd_config(5)。

    【讨论】:

    • 请参阅我对上述两个问题的回答,它们暗示了同样的事情。
    【解决方案4】:

    我不太确定您要问什么,但您可能要问的是使用公钥让 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'"
    

    并且不会被提示输入凭据。

    【讨论】:

    • 无密码 SSH 只会消除部分问题。一旦您在服务器上,如何自动运行命令?如果您想要做的是设置一些 env 标志然后 cd 进入一个目录然后“环顾四周”,即:编辑文件重新启动服务器再次编辑另一个文件重新启动,等等。
    • 将这些命令封装在一个 shell 脚本中并通过 SSH 执行该脚本。
    【解决方案5】:

    正如其他人所指出的,面料是一个不错的选择。还有pexpect,这可能是您正在寻找的更多内容。

    【讨论】:

    • 面料和 Paramiko。目前没有交互性。
    【解决方案6】:

    你可以和autoexpect一起玩。它创建expect 脚本(用于处理与用户交互的脚本语言)。运行

    autoexpect ssh me@somehost.com
    

    接下来是其余的命令。将创建脚本script.exp。 请注意,输入和输出的确切结果将由脚本记录。如果每次执行的输出可能不同,则需要修改生成的脚本。

    【讨论】:

    • 这看起来很有趣。我去看看
    【解决方案7】:

    尝试模块paramiko。这可以满足您的要求。

    【讨论】:

    • 据我所知,Paramiko 缺乏我需要的交互性。它通常驱动程序的整个执行。