我发现如果你命名你的文件"paramiko.py"你得到这个错误,但我将我的文件命名为别的东西,我仍然得到同样的错误.我真的不知道我做错了什么,我相当自信地成功安装了PyCrypto和Paramiko.
import paramiko
ssh = paramiko.SSHClient()
ssh.connect('127.0.0.1', username='meelo_rw', password='')
Run Code Online (Sandbox Code Playgroud)
在Windows 8.1上运行此命令.
我正在尝试使用基于此模块的 SCP: https: //pypi.python.org/pypi/scp
我尝试运行以下命令:
def scpImport():
ssh = SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(AutoAddPolicy)
ssh.connect("IP", port=22)
with SCPClient(ssh.get_transport()) as scp:
scp.put('test.txt')
Run Code Online (Sandbox Code Playgroud)
然而,我的程序说:
File "C:\Python34\lib\site-packages\paramiko\client.py", line 288, in connect
server_key)
TypeError: missing_host_key() missing 1 required positional argument: 'key'
Run Code Online (Sandbox Code Playgroud)
是因为我没有 ssh 的身份验证形式吗?我需要在连接语句中传递私钥/公钥吗?如果是这样,我不确定如何执行此操作,因为该模块的示例很少。
我想通过ssh(putty)自动执行相同的操作。使用腻子连接后,我的计算机.bashrc
已加载(因此我可以使用别名)。如果我尝试在Python中执行此操作,则别名sanity
是不可见的:
sanity: command not found
Run Code Online (Sandbox Code Playgroud)
使用source .bashrc
不是解决方案。
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('xxxxxxx', username='x', password='x', key_filename=None, look_for_keys=False)
stdin, stdout, stderr = ssh.exec_command(
"""
sanity;
""")
stdout.flush()
for line in stdout:
print line
print "END"
print stderr.read()
ssh.close()
Run Code Online (Sandbox Code Playgroud) 有个问题让我头疼了好几天了。我正在使用带有 Python 2.7.10 的 Paramiko 模块,并且我想向 Brocade 路由器发出多个命令,但只返回给定命令之一的输出,如下所示:
#!/usr/bin/env python
import paramiko, time
router = 'r1.test.example.com'
password = 'password'
username = 'testuser'
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(router, username=username, password=password)
print('Successfully connected to %s' % router)
remote_conn = ssh.invoke_shell()
output = remote_conn.recv(1000)
# Disable paging on Brocade.
remote_conn.send('terminal length 0\n')
# Check interface status.
remote_conn.send('show interfaces ethernet 0/1\n') # I only want output from this command.
time.sleep(2)
output = remote_conn.recv(5000)
print(output)
Run Code Online (Sandbox Code Playgroud)
如果我要打印完整的输出,它将包含发送到路由器的所有内容,但我只想查看 showinterfaces ethernet 0/1\n
命令的输出。
任何人都可以帮助解决这个问题吗?
我想问最后一件事。我想过滤变量output
并检查是否出现“up”或“down”等字符串,但我似乎无法让它工作,因为输出中的所有内容似乎都在新行上? …
如何将远程服务器中的文件复制/maindir/fil1.txt
到子目录/maindir/subdir/file1.txt
。我使用 实现了 SFTP paramiko
。但它总是检查要复制的本地路径。
filename_full_path='/maindir/fil1.txt'
destfilename_full_path='/maindir/subdir/file1.txt'
sftp.put(filename_full_path, destfilename_full_path)
Run Code Online (Sandbox Code Playgroud)
如何告诉SFTP本地路径也在远程主机中?
我想将文件从远程服务器复制到本地。
import paramiko
paramiko.util.log_to_file('/tmp/paramiko.log')
# open transport
username = "user"
host="example.com"
port = 22
transport = paramiko.Transport((host, port))
transport.start_client()
private_key_file = "/home/user/.ssh/id_rsa"
agent = paramiko.Agent()
key = paramiko.RSAKey.from_private_key_file(private_key_file)
transport.auth_publickey(username, key)
# get sftp client
sftp = paramiko.SFTPClient.from_transport(transport)
source = "/home/user/user_1.csv"
target = "/home/local/local_sftp.txt"
sftp.get(x[0], x[1])
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常,但我想使用source = "/home/user/user_*.csv"
但未评估此通配符。有人可以帮我解决这个问题。
我找到了一种解决方案,SCPClient
但无法解决SFTPClient
.
我正在尝试使用 sshtunnel 创建到服务器的隧道。我正在使用 ssh-key 和 ssh-agent:
from sshtunnel import SSHTunnelForwarder
with SSHTunnelForwarder(
(proxyhost, 22),
ssh_username=ssh_username,
#ssh_private_key_password=PASSPHRASE, # with this line it works
remote_bind_address=('127.0.0.1', 3306),
) as tunnel:
pass
Run Code Online (Sandbox Code Playgroud)
找到正确的私钥,当我给出密码作为参数时,隧道就建立了(请参见上面的注释行)。
但我已经使用 ssh-agent 解锁了我的 ssh 私钥(只有在重新启动后第一次使用 ssh 时才会要求我提供 ssh 密码)。是否可以让 paramiko/sshtunnel 获取解锁的私钥而不提示输入密码?我想避免将我的密码存储在磁盘上的任何位置。
我正在尝试使用 Paramiko Python 模块通过 SSH 连接到远程服务器。在 CentOS 7 服务器上使用 Python 3.6.7 版安装。但是收到以下错误。
python
import paramiko
>>> ssh = paramiko.SSHClient()
>>> ssh.load_system_host_keys()
>>> ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
>>> ssh.connect("19.16.2.2", username="user1", password="pass")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.6/site-packages/paramiko/client.py", line 424, in connect
passphrase,
File "/usr/local/lib/python3.6/site-packages/paramiko/client.py", line 643, in _auth
self._agent = Agent()
File "/usr/local/lib/python3.6/site-packages/paramiko/agent.py", line 372, in __init__
self._connect(conn)
File "/usr/local/lib/python3.6/site-packages/paramiko/agent.py", line 68, in _connect
raise SSHException('could not get keys from ssh-agent')
paramiko.ssh_exception.SSHException: could not get keys from …
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个 python2.7 函数,它可以判断是否可以使用 SSH 协议连接到特定的 IP 地址(主机)。问题是我必须在没有我要连接的设备的登录信息的情况下执行此操作。我的计划是尝试使用空字符串作为用户名和密码进行连接,然后使用它抛出的异常来确定它是否可以连接。我的推理是,例如,如果它抛出一个 AuthenticationException ,它一定已经尝试连接但只是确定登录信息无效。到目前为止,这是我的代码:
def ssh(host):
try:
s = paramiko.SSHClient()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
s.connect(host, username=None, password=None)
except(paramiko.ssh_exception.AuthenticationException,
paramiko.ssh_exception.BadAuthenticationType,
paramiko.ssh_exception.BadHostKeyException,
paramiko.ssh_exception.PasswordRequiredException,
paramiko.ssh_exception.PartialAuthentication):
return True
except Exception as e:
print(e)
return False
Run Code Online (Sandbox Code Playgroud)
当我运行它时,它总是返回 false 并输出: No authentication methods available
我的问题是:
提前致谢!
由于某些原因,我不得不使用mysql
Paramiko。
我有这个(简化的)片段:
stdin, stdout, stderr = c.exec_command("mysql stuff -e 'rename table foo to bar'")
print stdout.read()
print stderr.read()
Run Code Online (Sandbox Code Playgroud)
但如果表foo
不存在,我就没有输出(没有stdout
或stdin
输出)。
但这很奇怪,因为:
stdin, stdout, stderr = c.exec_command("mysql stuff -e 'rename table foo to bar'")
if stderr.read()
print "Error: %s" % stderr.read()
print type(stderr.read())
Run Code Online (Sandbox Code Playgroud)
有这个输出:
Error:
<type 'str'>
Run Code Online (Sandbox Code Playgroud)
而mysql
错误通常是:
第 1 行出现错误 1017 (HY000):找不到文件:“./stuff/foo.frm”(错误号:2 - 没有这样的文件或目录)
我想要更详细的错误输出,但我不能。为什么?
我想 ssh 到远程服务器并运行一些 shell 脚本(如 scp 或 yum 等)。
一切都很顺利,除了我无法连续获得诸如 scp 进度或 yum 下载进度之类的标准输出。将f.read
被阻止并且不会返回任何内容。
我猜 paramiko 可能会逐行传输假的标准输出流,但这些渐进输出不会输出行分隔符,而是输出“\r”。
有办法解决这个问题吗?
这就是我现在正在做的事情,在ssh
哪里paramiko.SSHClient()
def read_buffer_line(f):
line = ""
while not f.channel.exit_status_ready():
c = f.read(1)
if c == '\n':
yield line
line = ''
else:
line += c
yield line + f.read()
def ssh_run(ssh, cmd):
stdin, stdout, sterr = ssh.exec_command(cmd, get_pty=True, bufsize=1)
for l in read_buffer_line(stdout):
print l
Run Code Online (Sandbox Code Playgroud) 在过去的几天里,我一直在努力弄清楚为什么 paramiko 发送 \x07 而不是 tab 到远程会话。我使用 paramikos invoke_shell 因为我需要运行几个互连的命令。除了这部分之外,一切正常:
check_export = f'echo -e \"this\tis\tjust a test\" > /tmp/export'
Run Code Online (Sandbox Code Playgroud)
这是简化版本,唯一重要的部分是我需要用制表符分隔单词(仅在某些地方)。print 返回正确的形式:
echo -e "this is just a test" > /tmp/export
Run Code Online (Sandbox Code Playgroud)
但是当我从 paramiko 会话检查 recv() 时,我看到了这个:
b'echo -e "this\x07is\x07just a test" > /tmp/export\r\n[root@server~]# '
Run Code Online (Sandbox Code Playgroud)
因此,文件 /tmp/export 不包含制表符,并且前 3 个单词被挤在一起。我尝试提供文字选项卡,\t,U00000009,但没有任何效果。
我还尝试对字符串执行 .encode() ,但出现错误,指出需要字节,而不是字符串。
我在这里缺少什么?我希望得到一些意见。谢谢
我正在尝试使用Paramiko的库http://docs.paramiko.org/en/2.1/api/sftp.html与Python(v2.7)建立SFTP连接
通过网上的零碎零碎,我能够(无论如何也是如此)使用私有加密证书进行连接。
如下所示:
import paramiko
sftp = paramiko.SSHClient()
hostname = "sftp.host.com"
port = 8022
username = "sftplogin"
k = paramiko.RSAKey.from_private_key_file("private.pem", password="XXX")
sftp.set_missing_host_key_policy(paramiko.AutoAddPolicy())
print "Connecting..."
sftp.connect(hostname, port, username=username, pkey=k )
print "Connected to: " + hostname + ":" + port
print sftp.getcwd()
sftp.close()
Run Code Online (Sandbox Code Playgroud)
在这一点上,我只是想看看我是否没有妄想,并且实际上没有连接,所以我试图打印一个getcwd()来获取当前目录……可惜的是我什么都没有,因为它返回此错误:
AttributeError:“ SSHClient”对象没有属性“ getcwd”
谁能告诉我为什么?我究竟做错了什么?
提前致谢!
paramiko ×13
python ×12
ssh ×6
python-2.7 ×3
sftp ×3
python-3.x ×2
attributes ×1
bash ×1
centos ×1
mysql ×1
ssh-agent ×1
ssh-tunnel ×1