我遇到了一个似乎无法克服的错误。我有一个简单的结构任务,必须以远程系统上的不同用户身份运行,例如:
def update():
env.user = 'otheruser'
#~ env.password = 'otherpass' # this works, but I don't want it here.
with cd(env.sitefolder):
run('hg pull -u')
Run Code Online (Sandbox Code Playgroud)
如果我使用 env.password 硬编码来运行它,它就可以工作。如果我使用fab -p otherpass update它也有效。如果我省略它,文档说我会收到提示。这是事实,但行不通。每次输入密码后我都会收到此错误:
> fab dev update
[darkstar] Executing task 'update'
[darkstar] run: hg pull -u
[darkstar] Login password:
ERROR:paramiko.transport:Exception: Error reading SSH protocol banner
...
Fatal error: Error reading SSH protocol banner
Aborting.
Run Code Online (Sandbox Code Playgroud)
在 Ubuntu Natty 上使用 Fabric 1.2.2。我还尝试了 env.no_keys 选项,但它没有改变任何东西。有人可以帮忙吗?
我一直在尝试使用 paramiko 在Overture Box上运行命令来建立 SSH 连接。
我的脚本确实正确连接到盒子,没有看到任何问题,当脚本运行 exec_command(cmd) 方法时出现问题:
Traceback (most recent call last):
File "test.py", line 39, in <module>
stdin, stdout, stderr = ssh.exec_command("version")
File "/opt/csw/lib/python2.7/site-packages/paramiko/client.py", line 345, in exec_command
chan.exec_command(command)
File "/opt/csw/lib/python2.7/site-packages/paramiko/channel.py", line 60, in _check
return func(self, *args, **kwds)
File "/opt/csw/lib/python2.7/site-packages/paramiko/channel.py", line 229, in exec_command
self._wait_for_event()
File "/opt/csw/lib/python2.7/site-packages/paramiko/channel.py", line 1086, in _wait_for_event
raise e
paramiko.ssh_exception.SSHException: Channel closed.
Run Code Online (Sandbox Code Playgroud)
使用 Linux Box 作为目标主机的相同脚本会产生正确的结果
代码是借用的,我刚刚在谷歌上找到了片段:
import sys
import time
import select
import paramiko
host = raw_input("Hostname?: ")
i …Run Code Online (Sandbox Code Playgroud) 尝试使用 StringIO 将数据帧导出到 csv 并使用 paramiko 通过 SFTP 传输它。文件成功通过,但它是空的。知道为什么吗?
import pandas as pd
from StringIO import StringIO
import paramiko
names = ['Bob','Jessica','Mary','John','Mel']
births = [968, 155, 77, 578, 973]
BabyDataSet = list(zip(names,births))
df = pd.DataFrame(data = BabyDataSet, columns=['Names', 'Births'])
buf = StringIO()
df.to_csv(buf, sep = ',', header = True, index = False)
#buf.getvalue() # Correct output
transport = paramiko.Transport(('localhost', 22))
transport.connect(username='user', password='pass')
sftp = paramiko.SFTPClient.from_transport(transport)
upload_path = '/Users/user/Desktop/test.csv'
sftp.putfo(buf, upload_path)
sftp.close()
Run Code Online (Sandbox Code Playgroud) 我下载了 Anaconda 用于 Windows 上的 python 用法。我正在使用 paramiko 模块进行 SSH。当我尝试使用 paramiko 进行 SSH 连接时,出现以下错误,
Traceback (most recent call last):
File "C:\Users\Anaconda2\lib\site-packages\paramiko\transport.py", line 545, in start_client
raise e
ImportError: DLL load failed: The operating system cannot run %1.
Run Code Online (Sandbox Code Playgroud)
我尝试将“C:\Users\*****\Anaconda2\Library\bin”路径设置为环境变量。但在里面没有用。仍然错误不断。
代码片段:
import paramiko
sftpSession = None
sshSession = paramiko.SSHClient()
sshSession.set_missing_host_key_policy(paramiko.AutoAddPolicy())
sshSession.connect(hostname=hostname,username=username,password=password,timeout=2)
Run Code Online (Sandbox Code Playgroud) 我正在使用以下 Python 代码使用 Paramiko 通过 SFTP 上传文件。连接“似乎”很好,代码执行到最后,只是当我签入 FileZilla 时文件没有到达目的地。
我已经检查并将文件的权限设置为 777(只是为了确定)。我还在一个单独的终端中检查了我的文件路径字符串,路径是有效的。
import paramiko
.
.
transport = paramiko.Transport((host, port))
transport.connect(username = username, password = password)
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.put(filePath, "/") # Upload file to root FTP folder
sftp.close()
transport.close()
Run Code Online (Sandbox Code Playgroud)
我能做些什么来调试这个?我可以打印出什么,检查连接是否成功等?
import paramiko
from socket import error as socket_error
import os
server =['10.10.0.1','10.10.0.2']
path='/home/test/'
for hostname in server:
try:
ssh_remote =paramiko.SSHClient()
ssh_remote.set_missing_host_key_policy(paramiko.AutoAddPolicy())
privatekeyfile = os.path.expanduser('~/.ssh/id')
mykey = paramiko.RSAKey.from_private_key_file(privatekeyfile, password='test123')
ssh_remote.connect(hostname, username = 'test1', pkey = mykey)
sftp=ssh_remote.open_sftp()
for i in sftp.listdir(path):
info = sftp.stat(i)
print info.st_size
except paramiko.SSHException as sshException:
print "Unable to establish SSH connection:{0}".format(hostname)
except socket_error as socket_err:
print "Unable to connect connection refused"
Run Code Online (Sandbox Code Playgroud)
这是我的代码。我试图获取远程服务器文件的文件大小。但是下面的错误正在抛出。可以请一些指导吗?
错误
import paramiko
from socket import error as socket_error
import os
server =['10.10.0.1','10.10.0.2']
path='/home/test/' …Run Code Online (Sandbox Code Playgroud) 我使用的朋友服务器只允许一个用户从 SSH 登录,所以通常我只是以该用户身份登录,然后su -l myuser更改帐户。我想使用 Python 自动化一些无聊的东西,但我遇到了问题。显然,我首先尝试的 Paramiko 模块为每个命令调用一个 shell,所以这是不可能的。后来我尝试使用invoke_shell()来克服这个问题,但它仍然失败(我认为这是因为更改用户也会更改外壳)。
在那之后,我发现了 Fabric 模块,但我能做的最好的事情是在正确的用户登录的情况下打开 SSH shell,但没有选择从代码运行任何命令。
有没有办法做到这一点?最终目标可能是这样的:
ssh.login(temp_user, pass)
ssh.command("su -l myuser")
expect("Password: ", ssh.send("mypass\n")
ssh.command("somescript.sh > datadump.txt")
Run Code Online (Sandbox Code Playgroud)
使用sudo是不可能的,以及添加无密码登录。
正如这里所建议的那样,我尝试使用 Paramiko 的代码:
import paramiko
host = "hostip"
user = "user"
user_to_log = "myuser"
password = "pass"
password_to_log = "mypass"
login_command = "su -l " + user_to_log
ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostip, username=user,
password=password)
transport = ssh.get_transport()
session = transport.open_session()
session.set_combine_stderr(True)
session.get_pty()
session.exec_command("su -l " …Run Code Online (Sandbox Code Playgroud) 有没有办法我可以使用 paramiko scp 复制以名称“output”结尾的远程文件。
我有下面的代码,仅当我提供完整路径或确切的文件名时才会复制
下面是代码
import paramiko
import os
from paramiko import SSHClient
from scp import SCPClient
def createSSHClient(self, server):
client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(server, self.port, self.user, self.password)
return client
def get_copy(self, hostname, dst):
ssh = self.createSSHClient(hostname)
scp = SCPClient(ssh.get_transport())
scp.get(dst)
scp.close()
Run Code Online (Sandbox Code Playgroud)
我正在尝试的是
get_copy(1.1.1.1, "*output")
Run Code Online (Sandbox Code Playgroud)
我收到文件未找到错误
注意:我看过其他帖子,但没有一个帖子可以解释答案,也没有一个有效的帖子。
有没有办法获得 的输出exec_command,专门用于exec_command('docker run <CONTAINER_ID>')Paramiko 包的实时输出?
我有一个函数来检查文件是否存在,它返回'True'/ 'False',现在我正在将它“转换”为 bool eval(),但是我认为这不是最聪明的解决方案,但我不知道该怎么做它没有不必要的ifs,
>>> foo = 'False'
>>> type(eval(foo))
<class 'bool'>
>>> type(foo)
<class 'str'>
Run Code Online (Sandbox Code Playgroud)
例如,我在 ssh 连接的机器上运行这个表达式
"test -e {0} && echo True || echo False".format(self.repo)
Run Code Online (Sandbox Code Playgroud)
像这样,我的结果将是字符串。
def execute(command):
(_, stdOut, _) = ssh.exec_command(command)
output = stdOut.read()
return output.decode('utf-8')
Run Code Online (Sandbox Code Playgroud)
有没有其他方法可以实现这一目标?