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

Hi

Using Net::OpenSSH to SSH into a remote ox and getting "Pseudo-terminal will not be allocated because stdin is not a terminal." error. Can anyyone provide insights how to solve this issue. Thanks.

#!/usr/bin/perl use strict; use warnings; use Net::OpenSSH; my $user = ""; my $passwd = ""; my $host = ""; my @cmd = "show clock"; my @quitcmd = "exit"; my $ssh = Net::OpenSSH->new("$host", user => "$user", passwd => "$pass +wd", timeout => 90 ); $ssh->error and die "Couldn't establish SSH connection: ". $ssh->error; my @output = $ssh->capture({stdin_data => "@cmd\n@quitcmd\n"}); $ssh->error and die "Couldn't run remote command: ". $ssh->error; #close the ssh session undef $ssh;

Error

# open_ex: ['ssh','-O','check','-T','-S','/root/.libnet-openssh-perl/u +ser-10.253.10.10-25248-962213','-l','user','10.253.10.10','--'] # _waitpid(25251) => pid: 25251, rc: 0, err: # open_ex: ['ssh','-S','/root/.libnet-openssh-perl/user-10.253.10.10-2 +5248-962213','-l','user','10.253.10.10','--'] Pseudo-terminal will not be allocated because stdin is not a terminal. # _waitpid(25252) => pid: 25252, rc: 65280, err: Couldn't run remote command: child exited with code 255 at script.pl l +ine 42. # open_ex: ['ssh','-O','exit','-T','-S','/root/.libnet-openssh-perl/us +er-10.253.10.10-25248-962213','-l','user','10.253.10.10','--'] # _waitpid(25253) => pid: 25253, rc: 0, err:

Replies are listed 'Best First'.
Re: How to solve Pseudo terminal issue OpenSSH
by salva (Canon) on May 12, 2015 at 07:43 UTC
    Pseudo-terminal will not be allocated because

    That is not an error but a (harmless) warning. The error is somewhere else.

    In any case, your code is not requesting a tty but ssh is trying to allocate it. May you have some entry on your ssh configuration file (usually at ~/.ssh/config) requesting it?

    In order to discover the real error, enable debugging for ssh and post the output:

    $ssh = Net::OpenSSH->new(..., master_opts => '-vvvv');

      Salva,

      Adding verbose to script. To my knowledge of understanding, i can see start in command execution, but closing the channel 0 abruptly. Please help

      [root@-01 wlgw]# perl wlgw4.pl OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar 2010 debug1: Reading configuration data /etc/ssh/ssh_config debug1: Applying options for * debug2: ssh_connect: needpriv 0 debug1: Connecting to 10.10.10.10 [10.10.10.10] port 22. debug1: Connection established. debug1: permanently_set_uid: 0/0 debug1: identity file /root/.ssh/id_rsa type -1 debug1: identity file /root/.ssh/id_dsa type -1 debug1: Remote protocol version 2.0, remote software version OpenSSH_5 +.1 debug1: match: OpenSSH_5.1 pat OpenSSH* debug1: Enabling compatibility mode for protocol 2.0 debug1: Local version string SSH-2.0-OpenSSH_5.3 debug2: fd 3 setting O_NONBLOCK debug1: SSH2_MSG_KEXINIT sent debug3: Wrote 792 bytes for a total of 813 debug1: SSH2_MSG_KEXINIT received debug2: kex_parse_kexinit: diffie-hellman-group-exchange-sha256,diffie +-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellm +an-group1-sha1 debug2: kex_parse_kexinit: ssh-rsa,ssh-dss debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,arcfour256 +,arcfour128,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,a +es256-cbc,arcfour,rijndael-cbc@lysator.liu.se debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,arcfour256 +,arcfour128,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,a +es256-cbc,arcfour,rijndael-cbc@lysator.liu.se debug2: kex_parse_kexinit: hmac-md5,hmac-sha1,umac-64@openssh.com,hmac +-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96 debug2: kex_parse_kexinit: hmac-md5,hmac-sha1,umac-64@openssh.com,hmac +-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96 debug2: kex_parse_kexinit: none,zlib@openssh.com,zlib debug2: kex_parse_kexinit: none,zlib@openssh.com,zlib debug2: kex_parse_kexinit: debug2: kex_parse_kexinit: debug2: kex_parse_kexinit: first_kex_follows 0 debug2: kex_parse_kexinit: reserved 0 debug2: kex_parse_kexinit: diffie-hellman-group-exchange-sha256,diffie +-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellm +an-group1-sha1 debug2: kex_parse_kexinit: ssh-rsa debug2: kex_parse_kexinit: aes128-cbc,3des-cbc,blowfish-cbc,cast128-cb +c,arcfour128,arcfour256,arcfour,aes192-cbc,aes256-cbc,rijndael-cbc@ly +sator.liu.se,aes128-ctr,aes192-ctr,aes256-ctr debug2: kex_parse_kexinit: aes128-cbc,3des-cbc,blowfish-cbc,cast128-cb +c,arcfour128,arcfour256,arcfour,aes192-cbc,aes256-cbc,rijndael-cbc@ly +sator.liu.se,aes128-ctr,aes192-ctr,aes256-ctr debug2: kex_parse_kexinit: hmac-md5,hmac-sha1,umac-64@openssh.com,hmac +-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96 debug2: kex_parse_kexinit: hmac-md5,hmac-sha1,umac-64@openssh.com,hmac +-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96 debug2: kex_parse_kexinit: none,zlib@openssh.com debug2: kex_parse_kexinit: none,zlib@openssh.com debug2: kex_parse_kexinit: debug2: kex_parse_kexinit: debug2: kex_parse_kexinit: first_kex_follows 0 debug2: kex_parse_kexinit: reserved 0 debug2: mac_setup: found hmac-md5 debug1: kex: server->client aes128-ctr hmac-md5 none debug2: mac_setup: found hmac-md5 debug1: kex: client->server aes128-ctr hmac-md5 none debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP debug3: Wrote 24 bytes for a total of 837 debug2: dh_gen_key: priv key bits set: 139/256 debug2: bits set: 1045/2048 debug1: SSH2_MSG_KEX_DH_GEX_INIT sent debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY debug3: Wrote 272 bytes for a total of 1109 debug3: check_host_in_hostfile: filename /root/.ssh/known_hosts2 debug3: check_host_in_hostfile: match line 1 debug1: Host '10.10.10.10' is known and matches the RSA host key. debug1: Found key in /root/.ssh/known_hosts2:1 debug2: bits set: 1013/2048 debug1: ssh_rsa_verify: signature correct debug2: kex_derive_keys debug2: set_newkeys: mode 1 debug1: SSH2_MSG_NEWKEYS sent debug1: expecting SSH2_MSG_NEWKEYS debug3: Wrote 16 bytes for a total of 1125 debug2: set_newkeys: mode 0 debug1: SSH2_MSG_NEWKEYS received debug1: SSH2_MSG_SERVICE_REQUEST sent debug3: Wrote 48 bytes for a total of 1173 debug2: service_accept: ssh-userauth debug1: SSH2_MSG_SERVICE_ACCEPT received debug2: key: /root/.ssh/id_rsa ((nil)) debug2: key: /root/.ssh/id_dsa ((nil)) debug3: Wrote 64 bytes for a total of 1237 debug3: input_userauth_banner +============================================= +==+ | | +============================================= +==+ debug1: Authentications that can continue: publickey,password,keyboard +-interactive debug3: start over, passed a different list publickey,password,keyboar +d-interactive debug3: preferred keyboard-interactive,password debug3: authmethod_lookup keyboard-interactive debug3: remaining preferred: password debug3: authmethod_is_enabled keyboard-interactive debug1: Next authentication method: keyboard-interactive debug2: userauth_kbdint debug2: we sent a keyboard-interactive packet, wait for reply debug3: Wrote 96 bytes for a total of 1333 debug1: Authentications that can continue: publickey,password,keyboard +-interactive debug2: we did not send a packet, disable method debug3: authmethod_lookup password debug3: remaining preferred: debug3: authmethod_is_enabled password debug1: Next authentication method: password debug3: packet_send2: adding 64 (len 56 padlen 8 extra_pad 64) debug2: we sent a password packet, wait for reply debug3: Wrote 144 bytes for a total of 1477 debug1: Authentication succeeded (password). debug1: setting up multiplex master socket debug2: fd 4 setting O_NONBLOCK debug1: Entering interactive session. debug3: fd 5 is not O_NONBLOCK debug3: ssh_msg_recv entering debug3: ssh_msg_send: type 2 debug3: fd 5 is not O_NONBLOCK debug3: ssh_msg_recv entering debug3: ssh_msg_send: type 2 debug3: ssh_msg_recv entering debug3: muxserver_accept_control: receiving 1 env vars debug2: muxserver_accept_control: accepted tty 0, subsys 0, cmd show w +ag sub debug2: muxserver_accept_control: got fds stdin 6, stdout 7, stderr 8 debug3: ssh_msg_send: type 2 debug2: fd 5 setting O_NONBLOCK debug1: channel 0: new [client-session] debug3: muxserver_accept_control: channel_new: 0 debug2: channel 0: send open debug3: Wrote 64 bytes for a total of 1541 debug2: callback start debug2: client_session2_setup: id 0 debug1: Sending environment. debug1: Sending env LANG = en_US.UTF-8 debug2: channel 0: request env confirm 0 debug1: Sending command: show wag sub debug2: channel 0: request exec confirm 1 debug2: callback done debug2: channel 0: open confirm rwindow 0 rmax 32768 debug3: Wrote 128 bytes for a total of 1669 debug2: channel 0: rcvd adjust 2097152 debug2: channel_input_status_confirm: type 99 id 0 debug2: exec request accepted on channel 0 debug1: client_input_channel_req: channel 0 rtype exit-status reply 0 debug1: client_input_channel_req: channel 0 rtype eow@openssh.com repl +y 0 debug2: channel 0: rcvd eow debug2: channel 0: close_read debug2: channel 0: input open -> closed debug2: channel 0: rcvd eof debug2: channel 0: output open -> drain debug2: channel 0: obuf empty debug2: channel 0: close_write debug2: channel 0: output drain -> closed debug2: channel 0: rcvd close debug3: channel 0: will not send data after close debug2: channel 0: send close debug2: channel 0: is dead debug2: channel 0: garbage collecting debug1: channel 0: free: client-session, nchannels 1 debug3: channel 0: status: The following connections are open: #0 client-session (t4 r0 i3/0 o3/0 fd -1/-1 cfd 5) debug3: channel 0: close_fds r -1 w -1 e 8 c 5 debug3: Wrote 32 bytes for a total of 1701 debug3: fd 5 is not O_NONBLOCK debug3: ssh_msg_recv entering debug3: ssh_msg_send: type 2 debug3: Wrote 64 bytes for a total of 1765 Transferred: sent 1600, received 3072 bytes, in 0.2 seconds Bytes per second: sent 7345.1, received 14102.7 debug1: Exit status -1 [root@-01 wlgw]#
        What do you get when you pass the command as stdin_data?

        BTW, enable debugging for both Net::OpenSSH and the underlaying ssh.

Re: How to solve Pseudo terminal issue OpenSSH
by Anonymous Monk on May 11, 2015 at 22:18 UTC

    Are you just trying to execute the command "show" with the argument "clock"? If so, why are you using stdin_data at all? Shouldn't my @output = $ssh->capture(@cmd); be enough?

    a remote ox

    Not sure what OS oxen run... j/k ;-)

      Still same issue with my @output = $ssh->capture(@cmd);

      # open_ex: ['ssh','-O','check','-T','-S','/root/.libnet-openssh-perl/u +ser-10.253.10.10-25316-608967','-l','user','10.253.10.10','--'] # _waitpid(25319) => pid: 25319, rc: 0, err: # open_ex: ['ssh','-S','/root/.libnet-openssh-perl/user-10.253.10.10-2 +5316-608967','-l','user','10.253.10.10','--','show clock'] # _waitpid(25320) => pid: 25320, rc: 0, err: # open_ex: ['ssh','-O','exit','-T','-S','/root/.libnet-openssh-perl/us +er-10.253.10.10-25316-608967','-l','user','10.253.10.10','--'] # _waitpid(25321) => pid: 25321, rc: 0, err:
Re: How to solve Pseudo terminal issue OpenSSH
by pme (Monsignor) on May 12, 2015 at 11:52 UTC
    Hi waytoperl,

    What does 'show clock' command do? If it is screen-based command then you have to force the pseudo-terminal creation like this (not tested, Net::OpenSSH is not installed on my box):

    my $ssh = Net::OpenSSH->new("$host", user => "$user", passwd => "$pass +wd", timeout => 90, tty => 1 );
    You can read ssh for the details:
    -t Force pseudo-tty allocation. This can be used to exe +cute arbi- trary screen-based programs on a remote machine, which can + be very useful, e.g. when implementing menu services. Multip +le -t options force tty allocation, even if ssh has no local tty +.
      What does 'show clock' command do?

      Will display remote machine clock

      Force creation of Pseudo-terminal failed with an error