GVKun编程网logo

如何使用Paramiko获取SSH返回码?(paramiko.sshclient)

19

如果您对如何使用Paramiko获取SSH返回码?感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于如何使用Paramiko获取SSH返回码?的详细内容,我们还将为您解答par

如果您对如何使用Paramiko获取SSH返回码?感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于如何使用Paramiko获取SSH返回码?的详细内容,我们还将为您解答paramiko.sshclient的相关问题,并且为您提供关于Drush命令没有使用Paramiko执行、paramiko ssh 返回 []、paramiko 使用总结(SSH 操作远端机器)、paramiko.SSHException:读取SSH协议标语时出错的有价值信息。

本文目录一览:

如何使用Paramiko获取SSH返回码?(paramiko.sshclient)

如何使用Paramiko获取SSH返回码?(paramiko.sshclient)

client = paramiko.SSHClient()stdin, stdout, stderr = client.exec_command(command)

有什么方法可以获取命令返回码?

很难解析所有stdout / stderr并知道命令是否成功完成。

答案1

小编典典

SSHClient是一个简单的包装类,围绕着Paramiko中的更底层功能。该API文档列出recv_exit_status()的方法Channel类。

一个非常简单的演示脚本:

import paramikoimport getpasspw = getpass.getpass()client = paramiko.SSHClient()client.set_missing_host_key_policy(paramiko.WarningPolicy())client.connect(''127.0.0.1'', password=pw)while True:    cmd = raw_input("Command to run: ")    if cmd == "":        break    chan = client.get_transport().open_session()    print "running ''%s''" % cmd    chan.exec_command(cmd)    print "exit status: %s" % chan.recv_exit_status()client.close()

执行示例:

$ python sshtest.pyPassword: Command to run: truerunning ''true''exit status: 0Command to run: falserunning ''false''exit status: 1Command to run: $

Drush命令没有使用Paramiko执行

Drush命令没有使用Paramiko执行

我已经按照这里的步骤http://jessenoller.com/2009/02/05/ssh-programming-with-paramiko-completely-different/

用Python通过ssh连接到我的服务器。 我可以连接好,发送命令。

但是,当我运行stderr.readlines()时,即使该命令似乎已经正确执行,它也会显示每次下面的错误消息。 我closures了连接并重新启动了Python,结果仍然相同。

这是一个Python示例:

Drupal 7在“第一次加载”上太慢

每次服务器重新启动后MysqL都会损坏

如何在Nginx上安装PHP扩展?

Nginx的configuration:如何使用auth_basicauthentication如果ssl_client_certificate没有提供?

Drupal 7重写不使用.htaccess

>>> stdin,stdout,stderr = myssh.exec_command("xyz") >>> stderr.readlines() ['which: no PHP in (/usr/bin:/bin:/usr/sbin:/sbin:/big/dom/mydomain/pear/drush)n','/big/dom/mydomain/pear/drush/drush: line 89: exec: : not foundn','bash: xyz: command not foundn']

我已经安装了drush,似乎工作正常。 如果我在服务器上input“哪个PHP”,我会告诉它在哪里,而不是上面的错误信息。 我发送了一些其他命令来有目的地得到一个错误消息,看看是否清除任何东西。 相反,它在最后加上了一些东西。

在错误消息之后,我去看了引用的drush文件。 这里是第89行:

exec "$PHP" $PHP_options "$SCRIPT_PATH" --PHP="$PHP" --PHP-options="$PHP_options" "$@"

我相信“which PHP”命令来自这个行上面块的$ PHPvariables

if [ ! -z "$Drush_PHP" ] ; then # Use the Drush_PHP environment variable if it is available. PHP="$Drush_PHP" else # Default to using the PHP that we find on the PATH. # Note that we need the full path to PHP here for Dreamhost,which behaves oddly. See http://drupal.org/node/662926 PHP=`which PHP` # We check for a command line (cli) version of PHP,and if found use that. which PHP-cli >/dev/null 2>&1 if [ "$?" = 0 ] ; then PHP=`which PHP-cli` fi # On MSYsgiT,we need to use "PHP",not the full path to PHP if [ ! -z "$MSYstem" ] && [ "x${MSYstem:0:5}" = "xMINGW" ] ; then PHP="PHP" fi fi

该文件的全文如下: http : //pastebin.com/29AXmHKF

如果我尝试执行任何drush命令,我会得到相同的错误。 但是,如果我直接使用python / paramiko直接login到服务器,drush命令就可以正常工作。

在本地主机上运行Drupal windows7 EasyPHP 64x

检查cookie并用Apacheredirect

干净的URL不工作,mod_rewrite模块安装

在drupal模块中使用补丁

Drupal + Nginx + php-cgi:502错误的网关错误

我必须理解的第一件事是在执行命令的时候$ PATH变量是什么。 我跑了

>>> stdin,stderr = myssh.exec_command("echo $PATH") >>> stderr.readlines()

并意识到我的$ PATH是不一样的,当我直接在服务器上运行echo $ PATH! 我只能猜测,打开通道并发送命令之后,在某个时间点附加路径会附加到$ PATH变量。

但是,$ PATH所包含的是我之前添加到我的home文件夹中的.bashrc文件的路径。 所以,我所要做的也是添加到那里的路径(即使我在服务器上运行“echo $ PATH”时,那里的路径)。

现在我没有得到错误信息,我可以执行drush命令。

我使用了Mike Ryan的解决方案(感谢Mike!),但在stdout中找到了信息,而不是stderr。

stdin,stderr = server.ssh_client.exec_command("echo $PATH") print stdout.readlines()

如果您以交互方式ssh到该服务器并运行xyz ,会发生什么情况?

您只有在实际阅读时才能阅读错误消息,而不是在发送命令时阅读。 (谢谢,船长。)

错误输出看起来非常像你的xyz是一个以#!which PHP开头的PHP脚本。 但是shell找不到任何PHP可执行文件。 这可能是由于在登录脚本中没有正确设置PATH 。 确保你知道当你SSH的时候运行哪个登录脚本(通常是~/.bash_profile和/或~/.profile而不是~/.bashrc )。

paramiko ssh 返回 []

paramiko ssh 返回 []

如何解决paramiko ssh 返回 []?

我在 python 上使用 paramiko ssh 有问题。无论我做什么,我都只能从我尝试连接的任何设备(无处不在、思科等...)收到 [] 我已经搜索过互联网,但我不知道我做错了什么,有人可以帮助我吗?

import paramiko

def SSH_CONN(IP,USERNAME,PASSWORD,COMMANDS):
    device = paramiko.SSHClient()
    device.load_system_host_keys()
    device.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    device.connect(IP,username=USERNAME,password=PASSWORD,port=22)
    stdin,stdout,stderr = device.exec_command(COMMANDS)
    device_return = stdout.readlines()
    print(device_return)
    device.close()

SSH_CONN("IP","username","password","command")

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

paramiko 使用总结(SSH 操作远端机器)

paramiko 使用总结(SSH 操作远端机器)

1、用户名、密码登陆方式

import paramiko
paramiko.util.log_to_file(''paramiko.log'')  # 记录日志文件
ssh = paramiko.SSHClient()
try:
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(''139.xx.xx.xx'', username=''work'', password=''***'')
    cmd = ''ls''  # 需要执行的Linux命名
    stdin, stdout, stderr = ssh.exec_command(cmd) #执行命令后的结构
    print(stdout.readlines())
    print(stdout.read().decode())
except Exception as e:
    print("%s:%s" % (e.__class__, e))
finally:
    # 关闭
    ssh.close()
View Code
2、免密登陆方式
import paramiko
ssh = paramiko.SSHClient()
SSH_PRIVATE_KEY =''/Users/xueerhuan/.ssh/id_rsa''  #本地密钥文件路径

try:
    key = paramiko.RSAKey.from_private_key_file(SSH_PRIVATE_KEY) # 无解密密码时
    #key = paramiko.RSAKey.from_private_key_file(SSH_PRIVATE_KEY, password=''******'')  # 有解密密码时,

    ssh.load_system_host_keys() #通过known_hosts 方式进行认证可以用这个,如果known_hosts 文件未定义还需要定义 known_hosts
    #ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())  # 通过公共方式进行认证 (不需要在known_hosts 文件中存在)

    ssh.connect(hostname=''139.XX.XX.XX'', port=22, username=''root'', pkey=key)
    stdin, stdout, stderr = ssh.exec_command("ps")
    # 获取命令结果
    result = stdout.read()
    # 打印输出
    print(result.decode())
except Exception as e:
    print("%s:%s" % (e.__class__, e))
finally:
    # 关闭
    ssh.close()
View Code
注意:生成密码的方法
A、进入本地 ssh文件夹 cd .ssh/
B、使用ssh-keygen生产本地公钥和私钥 ssh-keygen
xueerhuan@ubuntu:~/.ssh$ ls
id_rsa id_rsa.pub
C、将生成的id_rsa.pub文件中的内容copy到目标机的.ssh/authorized_keys中就可以了,如果没有authorized_keys,自己创建。但是要注意authorized_keys的权限一般是600

或者直接在本地使用一条命令也可以实现公钥的复制,ssh-copy-id后面接入的用户就是要支持免密登录的用户。
morra@ubuntu:~/.ssh$ ssh-copy-id "morra@192.168.1.42"
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/morra/.ssh/id_rsa.pub" The authenticity of host ''192.168.1.42 (192.168.1.42)'' can''t be established. ECDSA key fingerprint is SHA256:/ufx+/OLtdsYy7vsdk4KDu9xJsBp6zHonRAf2jjT0GI. Are you sure you want to continue connecting (yes/no)? n^H Please type ''yes'' or ''no'': yes /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys Password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh ''morra@192.168.1.42''" and check to make sure that only the key(s) you wanted were added. #去目标机器下,检查authorized_keys文件 localhost:.ssh morra$ cat authorized_keys 
3、密码上传文件

import os
import paramiko
ssh = paramiko.SSHClient()
SSH_PRIVATE_KEY =''/Users/xueerhuan/.ssh/id_rsa''  #本地密钥文件路径
key = paramiko.RSAKey.from_private_key_file(SSH_PRIVATE_KEY)
paramiko.util.log_to_file(''paramiko.log'')

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(''139.XX.XX.XX'', username=''root'', password=''***'')
t = ssh.get_transport()
sftp = paramiko.SFTPClient.from_transport(t)
d = sftp.put("mm.txt", "/home/work/.ssh/mm.txt")
print(d)
View Code

4、免密上传文件

import os
import paramiko
ssh = paramiko.SSHClient()
SSH_PRIVATE_KEY =''/Users/xueerhuan/.ssh/id_rsa''  #本地密钥文件路径
key = paramiko.RSAKey.from_private_key_file(SSH_PRIVATE_KEY)
paramiko.util.log_to_file(''paramiko.log'')
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=''139.XX.XX.XX'', port=22, username=''root'', pkey=key)
t = ssh.get_transport()
sftp = paramiko.SFTPClient.from_transport(t)
d = sftp.put("mm.txt", "/home/work/.ssh/mm.txt")
print(d)
View Code

 

 

paramiko.SSHException:读取SSH协议标语时出错

paramiko.SSHException:读取SSH协议标语时出错

我正在使用Paramiko并尝试连接到我的SFTP服务器。这是我写的代码:

class SFTPUploader:    def __init__(self, host, username, password, port):        transport = paramiko.Transport((host, port))        print transport        transport.connect(username = username, password = password)        self.sftp = paramiko.SFTPClient.from_transport(transport)

我可以从终端连接到服务器。由于我们的情况不同,因此该线程无济于事。

答案1

小编典典

当paramiko没有收到协议标语或服务器发送无效消息时,将生成该错误。如果服务器正常运行,则可能是由于某些网络限制所致。

您可以使用-vvvopenssh客户端的选项来获取有关其连接方式的更多信息,并且可以使用端口22上的netcat或telnet轻松获得实际的横幅。横幅应以“
SSH-”开头,否则paramiko将返回上述错误立即。

我们今天的关于如何使用Paramiko获取SSH返回码?paramiko.sshclient的分享就到这里,谢谢您的阅读,如果想了解更多关于Drush命令没有使用Paramiko执行、paramiko ssh 返回 []、paramiko 使用总结(SSH 操作远端机器)、paramiko.SSHException:读取SSH协议标语时出错的相关信息,可以在本站进行搜索。

本文标签: