2011-07-20 19 views
6

Estoy trabajando en una aplicación que necesita enviar comandos a servidores remotos. Enviar comandos es bastante fácil con la gran cantidad de bibliotecas de cliente SSH.¿Cómo obtener Stateful ssh shell sesión programáticamente?

Sin embargo, me gustaría conservar el estado del shell (es decir, el directorio de trabajo actual, las variables de entorno, etc.) entre cada comando. Todas las bibliotecas cliente que he visto no hacen esto. Por ejemplo, el siguiente es un ejemplo de código que no no hacer lo que quiera:

use Net::SSH::Perl; 
my $server = Net::SSH::Perl->new($host); 
$server->login($user, $pass); 

$server->cmd('cd /var'); 
$server->cmd('pwd');  # I _would like_ this to output /var 

Habrá otras tareas llevadas a cabo entre el envío de comandos, por lo que la combinación de los comandos como $server->cmd('cd /var; pwd') no es aceptable.

Respuesta

0

No estoy seguro de lo que está haciendo exactamente, pero podría simplemente iniciar una sesión SSH. Si realmente no puedes hacer esto, tal vez puedas usar rutas absolutas para todo.

2

Net::SSH::Expect hace lo que quiere, aunque el modo "Esperar" no es completamente confiable, ya que analizará el resultado de sus comandos e intentará detectar cuándo aparece nuevamente el indicador del shell.

+0

Está bien siempre y cuando solo ejecute comandos que sepa cómo analizar la salida de. – Joshua

+0

@Joshua: bueno, descubrí más tarde que Net :: SSH :: Expect no utiliza ninguna lógica para averiguar cuándo se realiza el comando. Simplemente tiene un tiempo de espera (personalizable) y asume que el comando finaliza cuando termina el tiempo de espera. ¡Completamente poco confiable! – salva

+0

EWWW. Puede ser mejor que escribir la maldita cosa de esperar directamente entonces. – Joshua

Cuestiones relacionadas