Pase la entrada/variables al comando/script a través de SSH usando Python Paramiko
linux bash (1)
Escribe la entrada que tu comando necesita para la
stdin
:
stdin, stdout, stderr = self.client.exec_command(command)
stdin.write(name + ''/n'')
stdin.flush()
(Por supuesto, deberá propagar la variable de
name
de
module
a
sendCommand
, pero supongo que sabe cómo hacer esa parte).
Tengo problemas para pasar respuestas a un script de bash en un servidor remoto a través de SSH.
Estoy escribiendo un programa en Python 3.6.5 que será SSH a un servidor remoto de Linux. En este servidor remoto de Linux hay un script de bash que estoy ejecutando que requiere la entrada del usuario para completar. Por alguna razón, no puedo pasar una entrada de usuario de mi programa python original a través de SSH y hacer que complete las preguntas de entrada del usuario del script de 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.")
El final
/xxxxxx
en la clase
Connect
es el script remoto que se inicia.
Se abrirá una respuesta de texto a la espera de un formato como
Cuál es su nombre:
y parece que no puedo encontrar una manera de pasar correctamente la respuesta al script desde mi archivo
main.py
dentro de la clase
Connect
.
En todas las formas en que he intentado pasar el
name
como un argumento o una variable, la respuesta parece simplemente desaparecer (es probable que se trate de imprimirlo en el indicador de Linux y no dentro del script bash)
Creo que usar la función
read_until
para buscar
:
al final de la pregunta puede funcionar.
Sugerencias?