Python 在远程服务器上运行命令以查找正常运行时间(秒)
以下是我目前掌握的情况:Python 在远程服务器上运行命令以查找正常运行时间(秒),python,linux,python-3.x,Python,Linux,Python 3.x,以下是我目前掌握的情况: #!/usr/bin/python import sys import os import subprocess from subprocess import check_output import time import sh from sh import sshpass import re import time, datetime check_time = 0 with open("log.txt", "a") as f: while 1:
#!/usr/bin/python
import sys
import os
import subprocess
from subprocess import check_output
import time
import sh
from sh import sshpass
import re
import time, datetime
check_time = 0
with open("log.txt", "a") as f:
while 1:
#out = check_output(["sshpass", "-p", "pass", "ssh",
# "theo@localhost", "\"/usr/bin/cat",
# "/proc/uptime\""])
#print (out)
#out = str(out)
uptime = sh.Command("/usr/bin/sshpass")
result = uptime("-p", "pass", "ssh", "theo@localhost", "\"cat",
"/proc/uptime\"")
result = str(result)
print (result)
result = result.split(' ', 1)[0]
print (result)
f.write(result)
result_int = int(result)
if result_int > check_time:
print("it rebooted", result_int, "minutes ago")
time.sleep(5)
结果:
检查正常运行时间
回溯(最近一次呼叫最后一次):
文件“/uptime.py”,第23行,在
结果=正常运行时间(“-p”、“通过”、“ssh”和“theo@localhost“,”cat“,“/proc/uptime\”)
文件“/usr/lib/python3.5/site packages/sh.py”,第1021行,在调用中__
返回RunningCommand(cmd、call_args、stdin、stdout、stderr)
文件“/usr/lib/python3.5/site packages/sh.py”,第486行,在__
self.wait()
文件“/usr/lib/python3.5/site packages/sh.py”,第500行,正在等待
self.handle\u命令\u退出代码(退出代码)
文件“/usr/lib/python3.5/site packages/sh.py”,第516行,在handle\u命令\u exit\u代码中
raise exc(self.ran、self.process.stdout、self.process.stderr)
sh.ErrorReturnCode_127:
运行:'/usr/bin/sshpass-p pass sshtheo@localhost“cat/proc/uptime”
标准:
标准:
zsh:1:没有这样的文件或目录:cat/proc/uptime
您可以看到,我有两次尝试,一次使用sh
库,另一次使用check_输出,这两次尝试都会导致无法运行/usr/bin/cat/proc/uptime
的相同错误
但是,正如您在回溯结束时所看到的:
RAN: '/usr/bin/sshpass -p pass ssh theo@localhost "cat /proc/uptime"'
这似乎是一个完全有效的行,如果我复制粘贴到终端它的作品
有什么想法吗?如果我只输入“正常运行时间”,该命令实际上是有效的,但与编辑该命令的输出以秒为单位获得时间相比,我认为这样做更容易(至少我认为是这样):)
我正在使用python 3.5.2IRC上有人建议我使用
命令\u string=“cat/proc/cpu/”
和
result = uptime("-p", "pass", "ssh", "theo@localhost", command_string)
真管用 根据输出,您需要修改正常运行时间行,如下所示:
result = uptime("-p", "pass", "ssh", "theo@localhost", "cat",
"/proc/uptime")
看起来“cat/proc/uptime”在原始代码中被ssh解释为一个参数。看起来它试图执行文件
“cat/proc/uptime”
,而不是在/proc/uptime
上运行cat
。想象一下,这是一个你如何引用东西的问题。你在远程服务器上有足够的权限吗?我不知道引用哪里可能不正确。正如我所提到的,如果我在终端上运行,run:之后的那一行将非常有效。我有足够的权限。现在它实际上只是在本地主机上运行来测试它。以普通用户的身份运行cat/proc/uptime可以很好地工作。您可以尝试使用诸如,“\'cat”、“/proc/uptime\”
这样的单引号吗;此外,由于它是关键字,请尝试使用与“传递”不同的单词。你应该在你现在没有做的地方定义你的passwd
。哦,你是对的。。因为我看到的通过ssh运行远程命令的大多数示例都建议命令使用引号,所以我认为我必须这样做,但在测试之后,否则这似乎并不重要。当命令通过shell时,需要引号,但Python不是shell,用Python术语来说,shell希望运行['ssh','theo@localhost“,'cat/proc/uptime']
在shell中编写的方法是sshtheo@localhost“cat/proc/uptime”
。注意未加引号的空格如何变成参数分隔符,引号被丢弃,但保留引号之间的空格。