簡體   English   中英

在python中使用sshpass的ssh似乎不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM