SSHLibrary提示输入密码

时间:2018-06-22 14:01:57

标签: python robotframework paramiko robotframework-sshlibrary

我对测试套件有疑问。我使用机器人框架和python。我在python中创建了一个函数,该函数在远程Linux客户端中执行控制台命令。

def purge_default_dns(device_ip):
    ssh_val = "usr1@" + device_ip
    command = "ctool dns | grep -v \"grep\" | awk \'{print $2}\'"
    test = check_output(["ssh", ssh_val, "-p", "6022", command])

check_output()函数与device_ip连接并执行命令。如果我尝试使用完全限定的域名(例如my.domain.io)进行连接,则会提示输入密码(该密码为空)。我按Enter键,命令会定期执行。是否有任何参数传递,例如出现密码提示时输入Enter? 我尝试过ssh -e开关,我不想更改ssh客户端,我只需要一个通用解决方案。

Console windows


例如,使用下面的代码中的paramiko库,我可以创建一个paramiko SSHClient,它具有用于密码的参数并且不提示任何内容。虽然我现在不能使用paramiko,但我还需要SSHLirary来解决此问题。

def send_ssh_command(device_ip , command):
    hostname = device_ip
    password = ""
    username = "usr1"
    port = 6022
    try:
        client = paramiko.SSHClient()
        client.load_system_host_keys()
        client.set_missing_host_key_policy(paramiko.WarningPolicy())
        client.connect(hostname, port=port, username=username, password=password)
        stdin , stdout , stderr = client.exec_command(command)
        command_return_val = stdout.read()
    finally:
        client.close()
    return command_return_val

谢谢。

2 个答案:

答案 0 :(得分:2)

为简单起见,您寻找的唯一解决方案是将命令行上的密码传递给默认的OS ssh客户端,并且不要/不能安装任何可以帮助您解决问题的库(paramiko等)您通过其他方式达到了相同的结果?

我问这个问题是因为机器人框架的SSHLibrary开箱即用。您已经有了paramiko的python解决方案;而一般的linux解决方案是安装sshpass package,并使用它传递值:

sshpass -p "YOUR_PASS" ssh -usr1@my.domain.io:6022

因此,如果所有这些都不是一个选择,那么您将有两种选择-在SSH_ASKPASS周围乱砍东西-这里是an article的样本,或者使用expect进行传递-这是我更希望的两个。

这是一个非常不错的SO answer,其中expect周围有ssh脚本包装。在您的方法中,您将必须首先创建一个包含其内容的文件,在其上设置一个可执行标志,然后在check_output()中调用该文件,并将密码“ ssh”及其所有参数作为参数传递。 / p>

答案 1 :(得分:1)

为什么需要使用python,我在robotframework中使用了以下代码:

[Arguments]    ${host}=${APP_SERVER}    ${username}=${APP_USERNAME}    ${password}=${APP_PASSWORD}
Open Connection    ${host}    timeout=2m
Login    ${username}    ${password}
${out}  ${err}  ${rc}=   Execute Command   cd ${PATH};ctool dns | grep -v \"grep\" | awk \'{print $2}\' *    return_stdout=True   return_stderr=True   return_rc=True
Should Be Equal   ${rc}  ${0}