تمرير الإدخال/المتغيرات إلى الأمر/البرنامج النصي عبر SSH باستخدام Python Paramiko



linux bash (1)

اكتب المدخلات التي يحتاجها أمرك إلى stdin :

stdin, stdout, stderr = self.client.exec_command(command)
stdin.write(name + '\n')
stdin.flush()

(ستحتاج بالطبع إلى نشر متغير name من module إلى sendCommand ، لكنني أفترض أنك تعرف كيفية القيام بهذا الجزء).

أواجه مشكلات في تمرير الاستجابات إلى البرنامج النصي bash على خادم بعيد عبر SSH.

أكتب برنامج في Python 3.6.5 من شأنه أن SSH إلى خادم لينكس عن بعد. يوجد على خادم Linux البعيد هذا برنامج نصي للباش الذي أقوم بتشغيله والذي يتطلب إدخال المستخدم لملئه. لأي سبب من الأسباب لا أستطيع تمرير إدخال مستخدم من برنامج python الأصلي الخاص بي عبر SSH واجعله يملأ أسئلة إدخال مستخدم البرنامج النصي 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 للبحث عن : في نهاية السؤال قد ينجح.

اقتراحات؟





paramiko