使用Python Paramiko通过SSH将输入/变量传递给命令/脚本

我在通过SSH将响应传递到远程服务器上的bash脚本时遇到问题。


我正在用Python 3.6.5编写程序,该程序将SSH到远程Linux服务器。在此远程Linux服务器上,有一个正在运行的bash脚本,需要用户输入才能填充。无论出于何种原因,我都无法通过SSH传递来自原始python程序的用户输入,并使其填充bash脚本用户输入问题。


main.py


from tkinter import *

import SSH


hostname = 'xxx'

username = 'xxx'

password = 'xxx'


class Connect:

    def module(self):

        name = input()

        connection = SSH.SSH(hostname, username, password)

        connection.sendCommand(

            'cd xx/{}/xxxxx/ && source .cshrc && ./xxx/xxxx/xxxx/xxxxx'.format(path))

SSH.py


from paramiko import client


class SSH:


    client = None


    def __init__(self, address, username, password):

        print("Login info sent.")

        print("Connecting to server.")

        self.client = client.SSHClient()    # Create a new SSH client

        self.client.set_missing_host_key_policy(client.AutoAddPolicy())

        self.client.connect(

            address, username=username, password=password, look_for_keys=False) # connect


    def sendCommand(self, command):

        print("Sending your command")

        # Check if connection is made previously

        if (self.client):

            stdin, stdout, stderr = self.client.exec_command(command)

            while not stdout.channel.exit_status_ready():

                # Print stdout data when available

                if stdout.channel.recv_ready():

                    # Retrieve the first 1024 bytes

                    alldata = stdout.channel.recv(1024)

                    while stdout.channel.recv_ready():

                        # Retrieve the next 1024 bytes

                        alldata += stdout.channel.recv(1024)



                    # Print as string with utf8 encoding

                    print(str(alldata, "utf8"))

        else:

            print("Connection not opened.")

/xxxxxx类Connect中的最后一个是启动的远程脚本。它将打开一个文本响应,等待诸如


你叫什么名字:


而且我似乎无法找到一种方法将响应从我main.py的类文件中正确传递到脚本Connect。


我尝试以任何方式name作为参数或变量传递的答案似乎都消失了(可能是因为它试图在Linux提示符下而不是在bash脚本中打印它)


我认为使用read_until函数:在问题末尾查找可能有效。


有什么建议吗?


潇湘沐
浏览 992回答 1
1回答

慕仙森

将命令所需的输入写到stdin:stdin, stdout, stderr = self.client.exec_command(command)stdin.write(name + '\n')stdin.flush()(您当然需要将name变量从传播module到sendCommand,但我假设您知道该怎么做)。
打开App,查看更多内容
随时随地看视频慕课网APP