David1980 has asked for the wisdom of the Perl Monks concerning the following question:

Hello monks of Perl Knowledge

I am having an odd problem with SSH connection using Expect module.

As part of an application, I need to execute a command on the remote host via ssh. As it requires a pseduo-tty, I addedd '-t -t' flag to ssh to force it to allocate a pseduo-tty. Without this flag I am getting warning message "Pseduo-terminal will not be allocated because stdin is not a terminal"

The warning/error in question is "tcgetattr: No such device or address". I get this error while passing the password to remote host.

Code snippet below,

use Expect;
my $ssh = new Expect();
$ssh->spawn( "ssh user\@172.23.1.1" );
$ssh->expect(10, "password:");
print $ssh "$passwd\r";
$ssh->expect(65, "\$" );
print $ssh "$cmd\r";
$ssh->expect(65, "\$" );
my $output = $ssh->exp_before();
$ssh->soft_close() ;
print "$output";

Can anyone help me out !

Thanks
  • Comment on 'tcgetattr: No such device or address' on SSH using Expect.pm

Replies are listed 'Best First'.
Re: 'tcgetattr: No such device or address' on SSH using Expect.pm
by sierpinski (Chaplain) on Jun 01, 2010 at 12:30 UTC
    First thing, you can use the <code> tag to format your code for easier reading, and it also seems like you're not using 'use strict' and 'use warnings'. I highly recommend both.

    That being said, I'd also recommend looking into the Net::SSH::Expect module. It (to me) seems easier to use than the vanilla Expect.pm. Below is a snippet of code that I've used with it:

    my $ssh = Net::SSH::Expect->new ( host => "$serverlist[$host]", user => "$user", raw_pty => 1, restart_timeout_upon_receive => 1, timeout => 6, ssh_option => " -x", );
    It makes for pretty easy communication with the remote server, with several functions to send and receive data. You can receive for X seconds, read one line at a time, etc.

    According to the documentation on CPAN, you can use it with or without password authentication. In my environment, I have ssh keys distributed, so I've not used the password version, but the docs say it's available.
      The application is built with perl 5.005, not able to get Net::Perl::SSH or Net::Perl::Expect compatible to this version of perl & have limitation in upgrading the perl version, hence used the existing perl module Expect.pm
        You can always install a private copy of a modern perl, one that isn't 12 decades old