当前位置: 首页 > 面试题库 >

使用Python的Paramiko自动化ssh连接和程序执行

秦天宇
2023-03-14
问题内容

我想使用python自动执行特定任务。
除其他事项外,此任务包括使用ssh连接到远程服务器,以及运行 可能会或可能不会要求用户输入* 的特定程序(称为它prog.out)。
经过一些研究并权衡了我的选择之后,我决定使用Python的Paramiko(考虑到以下因素,结果可能是错误的)。
*

让我们prog.out从不询问任何输入的简单可能性开始,而只是将一些信息打印到控制台:

int main(int argc, char* argv[]) {

        printf("Hey there, fella\n");
        printf("How are you this morning?\n");
        printf("See ya...\n");

        return 0;
}

编译为:prog.out,位于 server_name上 ,等待执行。
因此,在这种情况下:

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect("server_name")
sin, sout, serr = client.exec_command('./prog.out')

for line in sout.readlines():
    print(line, end = '')

将正常工作,并将打印出任何prog.out产生的结果。
但是如果相反prog.out是:

int main(int argc, char* argv[]) {

        printf("Hey there, fella\n");
        printf("How are you this morning?\n");
        printf("please enter an integer...\n");
        int a;
        scanf("%d", &a);
        printf("you entered %d\n", a);
        printf("see ya...\n");

        return 0;
}

那么上面的python代码将在sout.readlines()(等待eof?)处
阻塞。避免阻塞的方法sout.readlines()prog.out通过写入其stdin管道来提供输入:

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect("server_name")
sin, sout, serr = client.exec_command('./prog.out')

sin.write('55\n')

for line in sout.readlines():
    print(line, end = '')

但是我无法事先知道是否prog.out需要用户输入…
我正在寻找一种可靠的运行方式,prog.out并让用户在必要的时间内与其进行交互。何时prog.out需要输入一些指示?

编辑

好的,我做了一些实验,发现只要prog.out没有退出就从通道进行read()的任何尝试都会被阻止,但是prog.out只要没有提供输入,就无法退出…
如何来了,prog.out即使还没有完成,我也无法读取已经发送的字节?
我真的很想模拟用户,就像他或她直接与prog.out…进行交互一样。


问题答案:

在Paramiko之上构建了一个库,它也许更适合您的需求。

我说的是python fabric(与我无关)

Fabric是一个Python(2.5-2.7)库和命令行工具,用于简化SSH在应用程序部署或系统管理任务中的使用。

它提供了用于执行本地或远程Shell命令(通常或通过sudo)和上载/下载文件的基本操作套件,以及诸如提示正在运行的用户进行输入或中止执行等辅助功能。

如果我正确理解了您的要求,那么您的代码可能看起来像这样。

from fabric.api import run

@task
def run_a_out()
    run('echo "some input for a.out" | ./a.out')

然后您将使用

    fab --hosts=someserver run_a_out

如果要动态控制将什么传递到a.out中,则可以向run_a_out()添加参数,然后从命令行传递它。

简而言之,Fabric为paramiko提供了更高级别的API,其中大部分复杂性都被隐藏了。



 类似资料:
  • 本文向大家介绍Python自动连接ssh的方法,包括了Python自动连接ssh的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python自动连接ssh的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的Python程序设计有所帮助。

  • 问题内容: 我是python新手。我写了一个脚本来连接到主机并执行一个命令 当远程命令不需要tty时,可以正常工作。我找到了一个与Paramiko的invoke_shell示例嵌套SSH会话。我对这种解决方案不满意,因为如果服务器上的提示未在我的脚本中指定->无限循环,或者脚本中指定的提示是返回文本中的字符串->不会接收到所有数据。有没有更好的解决方案,也许将stdout和stderr像我的脚本一

  • 我是Python的新手。我编写了一个脚本连接到主机并执行一个命令

  • 问题内容: 我正在使用Paramiko通过ssh连接到服务器。 基本身份验证效果很好,但我不明白如何使用公钥进行连接。 当我连接腻子时,服务器告诉我这一点: 我用这个ppk文件连接到它: 使用基本身份验证,我从日志中得到的错误是: 我尝试包含该ppk文件并将其设置为auth_public_key,但是没有用。 你能帮助我吗? 问题答案: 好的@Adam和@Kimvais是正确的,paramiko无

  • 问题内容: 下面的代码通过SSH在一台计算机上运行grep并打印结果: 我如何一次将5台机器全部置入grep(这样就不会造成重大延迟),而不是将所有这些都放入5个变量中并全部打印出来。 问题答案: 您需要将调用放在单独的线程(或进程中,但这可能会过大),这反过来又要求代码位于函数中(无论如何,这是一个好主意:模块的顶部没有大量代码水平)。 例如: If you had many more than

  • 本文向大家介绍Python使用paramiko连接远程服务器执行Shell命令的实现,包括了Python使用paramiko连接远程服务器执行Shell命令的实现的使用技巧和注意事项,需要的朋友参考一下 需求 在自动化测试场景里, 有时需要在代码里获取远程服务器的某些数据, 或执行一些查询命令,如获取Linux系统版本号 \ 获取CPU及内存的占用等, 本章记录一下使用paramiko模块SSH连