当前位置: 首页 > 面试题库 >

与Paramiko嵌套的SSH会话

孟征
2023-03-14
问题内容

我正在重写我在Python中编写的Bash脚本。该脚本的关键是

ssh -t first.com "ssh second.com very_remote_command"

我在使用paramiko进行嵌套身份验证时遇到问题。我找不到适合我具体情况的任何示例,但是我能够在远程主机上找到带有 sudo的 示例。

第一种方法写入标准输入

ssh.connect('127.0.0.1', username='jesse', password='lol')
stdin, stdout, stderr = ssh.exec_command("sudo dmesg")
stdin.write('lol\n')
stdin.flush()

第二个创建通道并使用类似于套接字的
sendrecv

我能够使 stdin.writesudo一起使用 ,但在远程主机上的 ssh 上却不起作用。

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('first.com', username='luser', password='secret')
stdin, stdout, stderr = ssh.exec_command('ssh luser@second.com')
stdin.write('secret')
stdin.flush()
print '---- out ----'
print stdout.readlines()
print '---- error ----'
print stderr.readlines()

ssh.close()

…印刷品…

---- out ----
[]
---- error ----
['Pseudo-terminal will not be allocated because stdin is not a terminal.\r\n', 'Permission denied, please try again.\r\n', 'Permission denied, please try again.\r\n', 'Permission denied (publickey,password,keyboard-interactive).\r\n']

伪终端错误使我想起了原始命令中的-t标志,因此我使用Channel切换到第二种方法。我没有ssh.exec_command和更高版本,而是:

t = ssh.get_transport()
chan = t.open_session()
chan.get_pty()
print '---- send ssh cmd ----'
print chan.send('ssh luser@second.com')
print '---- recv ----'
print chan.recv(9999)
chan = t.open_session()
print '---- send password ----'
print chan.send('secret')
print '---- recv ----'
print chan.recv(9999)

…但是它会打印’---- send ssh cmd ----‘并挂起,直到我终止该进程。

我是Python的新手,对网络的了解也不多。在第一种情况下,为什么发送密码只能用于 sudo 但不能用于 ssh
?提示是否不同?paramiko甚至是正确的库吗?


问题答案:

我设法找到一个解决方案,但是需要一些手工工作。如果有人有更好的解决方案,请告诉我。

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('first.com', username='luser', password='secret')

chan = ssh.invoke_shell()

# Ssh and wait for the password prompt.
chan.send('ssh second.com\n')
buff = ''
while not buff.endswith('\'s password: '):
    resp = chan.recv(9999)
    buff += resp

# Send the password and wait for a prompt.
chan.send('secret\n')
buff = ''
while not buff.endswith('some-prompt$ '):
    resp = chan.recv(9999)
    buff += resp

# Execute whatever command and wait for a prompt again.
chan.send('ls\n')
buff = ''
while not buff.endswith('some-prompt$ '):
    resp = chan.recv(9999)
    buff += resp

# Now buff has the data I need.
print 'buff', buff

ssh.close()

需要注意的是

t = ssh.get_transport()
chan = t.open_session()
chan.get_pty()

…你要这个

chan = ssh.invoke_shell()

这让我想起了我小时候放弃编写代码长达十年的尝试编写TradeWars脚本的过程。:)



 类似资料:
  • 问题内容: 我正在尝试使用Paramiko嵌套SSH,在那儿我将从本地计算机连接到Server X,然后从那里连接到ServerY。在这里使用用户名,密码身份验证连接到Server XI,并使用用户名和密码连接到Server Y RSA密钥。事实是,RSA密钥托管在用于连接服务器Y的系统X中。如果我将密钥文件托管在本地PC中,并将本地PC目录路径提供给Paramiko SSH客户端,则能够成功运行

  • 从到没有直接连接 上的SSH服务器将不接受任何打开连接到的直接TCPIP通道的尝试 我不能使用SSH密钥。只能通过给定的用户名和密码进行连接。 我不能使用 我不能使用 我要自动连接 我想保留paramiko的所有功能 我可以使用以下代码部分地实现这一点: 问题是,因为使用来运行给定的命令,所以它要求我根据用户输入给出密码“ad-hoc”(而且,它要求上的操作系统安装-这并不总是这样)。 由于的方法

  • 我正在编写一个python脚本,该脚本发送到网络中的每台交换机,并发出一个copy running-config TFTP命令,备份交换机的运行配置。我在windows上使用Python2.7中的paramiko库。 脚本本身非常简单,它所做的只是创建一个名为“备份”的目录(如果还不存在的话),以及另一个名为“今天的日期”的目录,然后将该目录用于TFTP。并启动TFTP服务器。然后它只需通过SSH

  • 问题内容: 我是python新手。我写了一个脚本来连接到主机并执行一个命令 当远程命令不需要tty时,可以正常工作。我找到了一个与Paramiko的invoke_shell示例嵌套SSH会话。我对这种解决方案不满意,因为如果服务器上的提示未在我的脚本中指定->无限循环,或者脚本中指定的提示是返回文本中的字符串->不会接收到所有数据。有没有更好的解决方案,也许将stdout和stderr像我的脚本一

  • 我是Python的新手。我编写了一个脚本连接到主机并执行一个命令

  • 前面的详细信息 我需要在交换机上使用ssh来ping不同的主机。早些时候,我为每个主机启动了一个线程,但结果很容易超过了最大ssh连接数,所以我根据这个创建了一个交互式shell会话。但当我并行运行时,它在发出第一个命令后就一直挂在那里。我不知道如何修复此问题。 简化代码如下: