client = paramiko.SSHClient()
stdin, stdout, stderr = client.exec_command(command)
Run Code Online (Sandbox Code Playgroud)
有没有办法获得命令返回码?
很难解析所有stdout/stderr并知道命令是否成功完成.
如下所示,是否可以保存结果?原因,在第二和第三stdout.read()我无法达到结果.
import paramiko
import os
dssh = paramiko.SSHClient()
dssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
dssh.connect('192.168.1.250', username='root', password='pass')
import os
stdin, stdout, stderr = dssh.exec_command('ifconfig')
print stdout.read()
print ('Sleeping 2 seconds!')
os.system('sleep 2')
stdin, stdout, stderr = dssh.exec_command('ls -l')
print stdout.read()
print stdout.read()
print stdout.read()
dssh.close()
Run Code Online (Sandbox Code Playgroud) 我使用paramiko从远程Linux机器启动shell脚本.启动shell脚本并执行命令make -j8.但是exec_command在make完成之前返回.
如果我在本地计算机上启动脚本,它会正确执行.
有人能解释一下这种行为吗?
我使用以下代码:
import paramiko
def runSshCmd(hostname, username, password, cmd, timeout=None):
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname, username=username, password=password,
allow_agent=False, look_for_keys=False, timeout=timeout)
stdin, stdout, stderr = client.exec_command(cmd)
stdin.flush()
data = stdout.read()
print (data)
client.close()
runSshCmd("10.128.12.32", "root", "C0mput3Gr!d", "ts_menu")
Run Code Online (Sandbox Code Playgroud)
当谈到stdout.read()时,它会挂起......有时它会在很长时间后打印输出.
你能否建议如果能解决这个问题?
我看到这个问题已经报道:
https://bugs.python.org/issue24026
在python中是否有更好的模块用于ssh连接和运行命令?
我有一个代码,我在远程Linux机器上执行命令并使用Paramiko读取输出.代码def看起来像这样:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(IPAddress, username=user['username'], password=user['password'])
chan = self.ssh.get_transport().open_session()
chan.settimeout(10800)
try:
# Execute thecommand
chan.exec_command(cmd)
contents = StringIO.StringIO()
data = chan.recv(1024)
# Capturing data from chan buffer.
while data:
contents.write(data)
data = chan.recv(1024)
except socket.timeout:
raise socket.timeout
output = contents.getvalue()
return output,chan.recv_stderr(600),chan.recv_exit_status()
Run Code Online (Sandbox Code Playgroud)
上面的代码适用于小输出,但它适用于较大的输出.
这里有缓冲相关的问题吗?
我在Ubuntu上用python编写程序.在该程序中,我尝试在连接到网络的远程计算机(RaspberryPi)上完成"删除文件"任务后打印一条消息.
但在实际操作中,打印命令不会等到远程机器上的任务完成.
任何人都可以指导我如何做到这一点?我的编码如下
import paramiko
# Connection with remote machine
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('192.168.2.34', username='pi', password='raspberry')
filename = 'fahad.txt'
filedelete ='rm ' + filename
stdin, stdout, stderr = client.exec_command(filedelete)
print ("File Deleted")
client.close()
Run Code Online (Sandbox Code Playgroud) 我使用Paramiko向远程Linux服务器运行一些ssh命令.这些命令将在控制台中连续输出,我想在本地控制台窗口中打印这些所有信息.
stdin, stdout, stderr = ssh.client.exec_command("ls")
for line in stdout.read()
print line,
ssh.client.close()
Run Code Online (Sandbox Code Playgroud)
因此,如果我编写这样的代码,所有输出信息将被发送回给我,直到命令完成执行,而我想在live中打印输出.
非常感谢.
所以我正在使用paramiko进行一些基本的SSH测试,我没有得到任何输出到stdout.继承我的代码.
import paramiko
client=paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
com="ls ~/desktop"
client.connect('MyIPAddress',MyPortNumber, username='username', password='password')
output=""
stdin, stdout, stderr = client.exec_command(com)
print "ssh succuessful. Closing connection"
client.close()
print "Connection closed"
stdout=stdout.readlines()
print stdout
print com
for line in stdout:
output=output+line
if output!="":
print output
else:
print "There was no output for this command"
Run Code Online (Sandbox Code Playgroud)
所以每当我运行它时,执行该命令(如果我执行类似cp的操作,文件被复制),但我总是得到"此命令没有输出".当打印stdout = stdout.readlines()时,[]是输出.另外,如果我在for循环中添加一个print语句,它就永远不会运行.有人可以帮帮我吗?谢谢!
我在paramiko中写了这段代码:
def TryExecute(hostname='192.168.1.1', user='root', passwd='root'):
ssh = SSHClient()
ssh.set_missing_host_key_policy(AutoAddPolicy())
ssh.connect(hostname, username=user, password=passwd, timeout=3)
#stdin, stdout, stderr = ssh.exec_command("uname -a")
session = ssh.invoke_shell()
session.send("\n")
session.send("echo step 1\n")
time.sleep(1)
session.send("sleep 30\n")
time.sleep(1)
while not session.recv_ready():
time.wait(2)
output = session.recv(65535)
session.send("echo step 2\n")
time.sleep(1)
output += session.recv(65535)
Run Code Online (Sandbox Code Playgroud)
我尝试在我的linux服务器上执行更多命令,问题是我的python代码不等待完成执行命令,例如,如果我尝试执行"sleep 30",则python不等待30秒完成执行命令,怎么解决这个问题?我试试白衣,而recv_ready()蝙蝠不等待:(
我有一个函数来检查文件是否存在,它返回'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)
有没有其他方法可以实现这一目标?
我的SSH.py目标是通过 SSH 连接到许多服务器来运行 Python 脚本 ( worker.py)。我正在使用 Paramiko,但对它非常陌生,并且不断学习。在我通过 ssh 连接的每台服务器上,我需要保持 Python 脚本运行——这是为了并行训练模型,因此脚本需要在所有机器上运行,以便联合更新模型参数/训练。服务器上的 Python 脚本需要运行,因此要么所有 SSH 连接都无法关闭,要么我必须找到一种方法,让服务器上的 Python 脚本即使关闭连接也能继续运行。
从广泛的谷歌搜索来看,您似乎可以通过nohup以下方式实现此目的:
client = paramiko.SSHClient()
client.connect(ip_address, username, password)
transport = client.get_transport()
channel = transport.open_session()
channel.exec_command("python worker.py > /logs/'command output' 2>&1")
Run Code Online (Sandbox Code Playgroud)
但是,我不清楚如何关闭/退出所有 SSH 连接?我正在运行该SSH.py文件cmd.exe,关闭该cmd.exe文件是否足以远程关闭所有进程?
此外,我的使用是否client.close()符合我的目的?请参阅下面我的代码。
# SSH.py
import paramiko
import argparse
import os
path = "path"
python_script = "worker.py"
# definitions for ssh connection and cluster
ip_list = ['XXX.XXX.XXX.XXX', XXX.XXX.XXX.XXX', XXX.XXX.XXX.XXX'] …Run Code Online (Sandbox Code Playgroud) paramiko ×11
python ×11
ssh ×4
openssh ×1
python-2.7 ×1
python-3.x ×1
save ×1
shell ×1
windows ×1