Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

This is a very basic question I am just quite new to bash and couldn't figure out how to do this. Googling unfortunately didn't get me anywhere.

My goal is to connect with sftp to a server, upload a file, and then disconnect.

I have the following script:

UpdateJar.sh

#!/bin/bash

sftp -oPort=23 [email protected]:/home/kalenpw/TestWorld/plugins
#Change directory on server
#cd /home/kalenpw/TestWorld/plugins

#Upload file
put /home/kalenpw/.m2/repository/com/Khalidor/TestPlugin/0.0.1-SNAPSHOT/TestPlugin-0.0.1-SNAPSHOT.jar

exit

the issue is, this script will establish an sftp connection and then do nothing. Once I manually type exit in connection it tries to execute the put command but because the sftp session has been closed it just says put: command not found.

How can I get this to work properly?

Thanks

share|improve this question
    
up vote 8 down vote accepted

You can change your script to pass commands in a here-document, e.g.,

#!/bin/bash

sftp -oPort=23 [email protected]:/home/kalenpw/TestWorld/plugins <<EOF
put /home/kalenpw/.m2/repository/com/Khalidor/TestPlugin/0.0.1-SNAPSHOT/TestPlugin-0.0.1-SNAPSHOT.jar   
exit
EOF

The << marker followed by the name (EOF) tells the script to pass the following lines until the name is found at the beginning of the line (by itself).

share|improve this answer
    
Awesome that did exactly what I needed. I will have to read up on here documents. Thanks for the quick answer I'll accept it in 8 min. – kalenpw yesterday
    
No problem (I took a look for a duplicate but only found one closed as "unclear"). – Thomas Dickey yesterday
    
Are you sure the server won't choke on the shell-script's comments? – alk yesterday
    
Also this approach depends on the kind of shell. – alk yesterday
    
@alk the script works with and without comments – kalenpw 20 hours ago

You can also use the -b option of sftp to indicate a file containing commands for sftp.

For example, you can put all your commands in file sftp_commands.txt:

cd /home/kalenpw/TestWorld/plugins
put /home/kalenpw/.m2/repository/com/Khalidor/TestPlugin/0.0.1-SNAPSHOT/TestPlugin-0.0.1-SNAPSHOT.jar
exit

and run sftp as:

sftp -oPort=23 -b sftp_commands.txt [email protected]:/home/kalenpw/TestWorld/plugins 

Or you can pass the commands via STDIN too if you don't want to use a file.

From man sftp:

-b batchfile

Batch mode reads a series of commands from an input batchfile instead of stdin. Since it lacks user interaction it should be used in conjunction with non-interactive authentication. A batchfile of ‘-’ may be used to indicate standard input. sftp will abort if any of the following commands fail: get, put, reget, rename, ln, rm, mkdir, chdir, ls, lchdir, chmod, chown, chgrp, lpwd, df, symlink, and lmkdir. Termination on error can be suppressed on a command by command basis by pre‐ fixing the command with a ‘-’ character (for example, -rm /tmp/blah*).

share|improve this answer

You might prefer to use scp instead of sftp. scp behaves much like the ordinary cp command does, but the files can be remote:

scp -P 23 /home/kalenpw/.m2/repository/com/Khalidor/TestPlugin/0.0.1-SNAPSHOT/TestPlugin-0.0.1-SNAPSHOT.jar [email protected]:/home/kalenpw/TestWorld/plugins

This copies the file on you local machine into a directory on the remote machine without having to use the old-school ftp-style command interface.

The ssh, scp, and sftp services are usually available if any of them are; the same daemon program provides all of them simultaneously. In principle the server's administrator could choose to disable any of them, but in practice that's quite rare.

share|improve this answer
    
Didn't know about scp beforehand looks very useful. And you were right scp is already available on my machine – kalenpw yesterday

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.