Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pseudo-terminal will not be allocated because stdin is not a terminal

I am trying to write a shell script that creates some directories on a remote server and then uses scp to copy files from my local machine onto the remote. Here's what I have so far:

ssh -t user@server<<EOT DEP_ROOT='/home/matthewr/releases' datestamp=$(date +%Y%m%d%H%M%S) REL_DIR=$DEP_ROOT"/"$datestamp if [ ! -d "$DEP_ROOT" ]; then     echo "creating the root directory"     mkdir $DEP_ROOT fi mkdir $REL_DIR exit EOT  scp ./dir1 user@server:$REL_DIR scp ./dir2 user@server:$REL_DIR 

Whenever I run it I get this message:

Pseudo-terminal will not be allocated because stdin is not a terminal. 

And the script just hangs forever.

My public key is trusted on the server and I can run all the commands outside of the script just fine. Any ideas?

like image 797
Matthew Avatar asked Aug 18 '11 22:08

Matthew


People also ask

How do you allocate pseudo-terminal?

When you run ssh without a command just to login, a pseudo tty is automatically allocated. But if you specify a command to execute on the ssh command line, by default, ssh does not allocate a pseudo tty. You need to force it to allocate one if you want to run commands such as top or screen.

What is pseudo tty allocation?

A pseudo-TTY is a pair of character special files, a master file and a corresponding slave file. The master file is used by a networking application such as OMVS or rlogin. The corresponding slave file is used by the shell or the user's process to read and write terminal data.

What is a pseudo-terminal in Linux?

A pseudo-terminal is a special interprocess communication channel that acts like a terminal. One end of the channel is called the master side or master pseudo-terminal device, the other side is called the slave side.


2 Answers

Try ssh -t -t(or ssh -tt for short) to force pseudo-tty allocation even if stdin isn't a terminal.

See also: Terminating SSH session executed by bash script

From ssh manpage:

-T      Disable pseudo-tty allocation.  -t      Force pseudo-tty allocation.  This can be used to execute arbitrary          screen-based programs on a remote machine, which can be very useful,         e.g. when implementing menu services.  Multiple -t options force tty         allocation, even if ssh has no local tty. 
like image 99
carok Avatar answered Sep 21 '22 19:09

carok


Also with option -T from manual

Disable pseudo-tty allocation

like image 31
Emil Bojda Avatar answered Sep 21 '22 19:09

Emil Bojda