【问题标题】:Python script - connect to SSH and run commandPython 脚本 - 连接到 SSH 并运行命令
【发布时间】:2024-01-19 16:08:01
【问题描述】:

我已经知道 Python 有 ssh 模块,但这不是我要找的。 我想要的是一个 python 脚本来执行以下操作:

  1. > 连接到 [ 用户输入 ] SSH 主机
  2. > 使用凭据 [由用户提供] 进行连接
  3. > 在 SSH 主机上运行命令 [ telnet 到 [主机 - 用户输入]
  4. > 在 telnet 会话中选择菜单项

提前致谢,

最好的问候,

【问题讨论】:

  • 我不明白。你需要在 Python 中做 SSH 相关的事情,而你对 Python 的 SSH 模块不感兴趣?
  • @Tokland,我正在寻找示例脚本。不是为了回答,“Fabric 是一个 Python 库和命令行工具,用于简化 SSH 的使用”:)

标签: python automation ssh telnet


【解决方案1】:

【讨论】:

    【解决方案2】:

    【讨论】:

      【解决方案3】:

      现在流行的解决方案是Fabric

      【讨论】:

        【解决方案4】:

        如果您真的在寻找一个可以让您自动执行 CLI 交互的模块,这里有 pexpect

        【讨论】:

          【解决方案5】:

          有很多图书馆可以做到这一点。

          1. 子流程
          2. 期待
          3. Paramiko(最常用)
          4. 面料
          5. 说明

          您可以查看他们的文档以了解实施情况。

          【讨论】:

            【解决方案6】:

            您可以使用专门为此设计的vassal 包。

            你只需要安装vassal并做

            from vassal.terminal import Terminal
            shell = Terminal(["ssh username@host", "cd scripts", "python foo1.py", "python foo2.py"])
            shell.run()
            

            这将每秒运行一次命令,您可以通过更改 sec=0.1 使其运行更快。

            【讨论】:

              【解决方案7】:

              我会推荐你​​:

              import spur
              
              shell = spur.SshShell(hostname="localhost", username="bob", password="password1", missing_host_key=spur.ssh.MissingHostKey.accept)
              result = shell.run(["echo", "-n", "hello"])
              print(result.output) # prints hello
              
              import paramiko
              
              hostname = 'enter_host'
              username = 'enter_user'
              password = 'enter_pass'
              
              client = paramiko.SSHClient()
              client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
              client.connect(hostname, username=username, password=password)
              
              stdin, stdout, stderr = client.exec_command('cd /enter/valid/path && ls -l')
              
              for line in stdout:
                  print(line.strip('\n'))
              
              client.close()
              

              输出:

              -rw-rw-r-- 1 username username 2712 Jan 22 14:49 file_1.ini
              -rw-rw-r-- 1 username username 5928 Jan 22 14:50 file_2.log
              -rw-rw-r-- 1 username username 1454 Jan 14 23:31 file_3.sql
              -rw-rw-r-- 1 username username  337 Jan 14 23:31 file_4.py
              drwxrwxr-x 3 username username 4096 Jan 14 23:33 folder_1
              drwxrwxr-x 2 username username 4096 Jan 14 23:33 folder_2
              -rw-rw-r-- 1 username username 2566 Jan 21 12:38 file_5.md
              -rw-rw-r-- 1 username username   63 Jan 14 23:31 file_6.txt
              drwxrwxr-x 4 username username 4096 Jan 14 23:31 folder_3
              drwxrwxr-x 9 username username 4096 Jan 21 12:38 folder_4
              
              • 不需要库
              import subprocess
              
              subprocess.Popen("ssh {user}@{host} {cmd}".format(user=user, host=host, cmd='ls -l'), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
              

              【讨论】: