如果您对如何使用Paramiko获取SSH返回码?感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于如何使用Paramiko获取SSH返回码?的详细内容,我们还将为您解答par
如果您对如何使用Paramiko获取SSH返回码?感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于如何使用Paramiko获取SSH返回码?的详细内容,我们还将为您解答paramiko.sshclient的相关问题,并且为您提供关于Drush命令没有使用Paramiko执行、paramiko ssh 返回 []、paramiko 使用总结(SSH 操作远端机器)、paramiko.SSHException:读取SSH协议标语时出错的有价值信息。
本文目录一览:- 如何使用Paramiko获取SSH返回码?(paramiko.sshclient)
- Drush命令没有使用Paramiko执行
- paramiko ssh 返回 []
- paramiko 使用总结(SSH 操作远端机器)
- paramiko.SSHException:读取SSH协议标语时出错
如何使用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执行
我已经按照这里的步骤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 返回 []?
我在 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 操作远端机器)
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()
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()
注意:生成密码的方法
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)
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)
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没有收到协议标语或服务器发送无效消息时,将生成该错误。如果服务器正常运行,则可能是由于某些网络限制所致。
您可以使用-vvv
openssh客户端的选项来获取有关其连接方式的更多信息,并且可以使用端口22上的netcat或telnet轻松获得实际的横幅。横幅应以“
SSH-”开头,否则paramiko将返回上述错误立即。
我们今天的关于如何使用Paramiko获取SSH返回码?和paramiko.sshclient的分享就到这里,谢谢您的阅读,如果想了解更多关于Drush命令没有使用Paramiko执行、paramiko ssh 返回 []、paramiko 使用总结(SSH 操作远端机器)、paramiko.SSHException:读取SSH协议标语时出错的相关信息,可以在本站进行搜索。
本文标签: