[英]ssh using sshpass in python seems to not work
我有一个python脚本,应该将其SSH到客户端并从客户端执行bash。 作为测试方案,我仅使用一台计算机进行连接,但是目标是连接到多个客户端并从这些计算机执行bash脚本。
我的Python代码:
import os
import subprocess
import time
def ssh_login_execute():
if device['PWD'] != "":
run=('sshpass -p %s ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -t -p %s %s@%s' % (device['PWD'], device['PORT'], device['USER'], device['IP']))
else:
run=('ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -t -p %s %s@%s' % (device['PORT'], device['USER'], device['IP']))
cmd = ('cd %s' % (script_path))
run2=run.split()
run2.append(cmd)
t=subprocess.Popen(run2, stdout=subprocess.PIPE, stderr=open(os.devnull, 'w'))
print "I am in 192.168.1.97"
execute_tg()
return t
def execute_tg():
path = "/home/"
os.chdir(path)
print os.getcwd()
cmd=("sh my_script.sh")
t=subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
if __name__ == "__main__":
device = {}
device['PORT']=22
device['PWD']= "abcd"
device['USER']= "root"
device['IP']= "192.168.1.97"
script_path= "/home/"
ssh_login_execute()
运行代码“ python script.py”时,我看到的输出为:
I am in 192.168.1.97
/home/
Output is sh: 0: Can't open my_script.sh
尽管“ my_script.sh”位于192.168.1.97的/ home目录中。 我如何摆脱这个问题,同时使其可伸缩以ssh到多个客户端并执行bash。
您的脚本my_script.sh
可能不在代码中预期的/home/
。
path = "/home/"
os.chdir(path)
print os.getcwd()
cmd=("sh my_script.sh")
另外,它还应该使用print os.getcwd()
打印当前目录。 您应该根据脚本的实际位置更改这些值。
这是一个使用paramiko模块和使用getpass模块的示例:
#!/usr/bin/python
import paramiko
import getpass
class Remote():
def __init__(self, hostfile, username, commands):
self.hostfile = hostfile
self.username = username
self.commands = commands
def execute(self):
client = paramiko.SSHClient()
client.load_system_host_keys()
##########################################################
# just in case it does not recognize the known_host keys
# in the known_hosts file
##########################################################
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.password = getpass.getpass("Password: ")
for i in self.hostfile.readlines():
print("Connecting to..." + i)
client.connect(i.strip(), 22, self.username, self.password)
stdin, stdout, stderr = client.exec_command(self.commands)
for t in stdout.readlines():
print(t.strip())
for t in stderr.readlines():
print(t.strip())
#--------------------------------------------------------
commands="""
echo "##################################################";
hostname;
echo "##################################################";
uname -a;
echo "##################################################";
dmidecode -t bios
"""
#---------------------------------------------------------
username = raw_input("Username: ")
hostfile = open('hosts')
a = Remote(hostfile, username, commands)
a.execute()
您的“主”目录通常类似于/home/<username>
或/users/<username>
。 通常,shell通常会接受~
作为主目录路径的同义词。 而是这样做吗:
cmd=("sh ~/my_script.sh")
实际上,sshpass一次执行ssh命令/连接。 通过subprocess.Popen()执行远程查询后,您的程序控件将在下一行返回到本地计算机。 并且您的程序将给出错误“无法打开my_script.sh”,因为您的脚本不在本地计算机上,而在远程计算机上。
我的建议是使完整的sshpass命令与在单个程序变量中执行的内容(在您的情况下为'run2'变量)一起执行,然后一次性将其传递给subprocess.Popen()。 修改后的代码如下:
import os
import subprocess
import time
def ssh_login_execute():
if device['PWD'] != "":
run=('sshpass -p %s ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -t -p %s %s@%s' % (device['PWD'], device['PORT'], device['USER'], device['IP']))
else:
run=('ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -t -p %s %s@%s' % (device['PORT'], device['USER'], device['IP']))
cmd = ('sh /%s/%s' % (script_path,'my_script.sh'))
run2=run.split()
run2.append(cmd)
t=subprocess.Popen(run2, stdout=subprocess.PIPE, stderr=open(os.devnull, 'w'))
print "I am in 192.168.1.97" # HERE YOU ASSUMED THAT YOU ARE IN REMOTE MACHINE BUT ACTUALLY YOU ARE IN LOCAL MACHINE ONLY
return t
if __name__ == "__main__":
device = {}
device['PORT']=22
device['PWD']= "abcd"
device['USER']= "root"
device['IP']= "192.168.1.97"
script_path= "/home/"
ssh_login_execute()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.