Reputation: 51
I would like to create a script that automatically logs into a remote server and grabs a file on the server. The script already logs into the server however the commands are not run on that machine. Once I disconnect from the remote server, the commands are run on the client machine.
!/bin/sh
ssh -o PreferredAuthentications=publickey [email protected]
cd ~/folder
"i would like to grab file and copy it to client machines folder"
EDIT: I am not sure if you noticed but I am used a passwordless connection to the remote server using ssh and keygeneration. I appreciate the ideas but I am looking to possibly pipe commands or run commands on the remote server with the script on the client. I realize that the remote server does not have access to the client script, however I was curious if it was possible to pipe the commands through the ssh connection.
Upvotes: 5
Views: 77318
Reputation: 281
If you want to invoke a script on remote host, which present on localhost
ssh remote Password@remoteHostname < localScript.sh
If you want to invoke a script which is already on remote host
ssh remote Password@remoteHostname "$PATH_OF_SCRIPT/remoteScript.sh"
Upvotes: 0
Reputation: 499
In addition to the answer by Tiemen, of course you can pipe the commands from your local script with:
ssh thehost < commands.sh
Upvotes: 2
Reputation: 101
scp? Remote is an appliance with a read only file system. I don't want to leave the script behind, or use multiple invocations of ssh to clean it up after or multiple invocations to execute it one line at a time. The list goes on...
great solution here by Yarek T:
You might have to play around a bit with quoting or escapes but it gets the job done, with a single connection to the remote and the script remaining local.
Upvotes: 1
Reputation: 26757
If your goal is only to transfer files, you should use scp. But to execute some commands on the remote host without having a specific script on that remote host, you can simply use the stdin like this:
!/bin/sh
ssh -o PreferredAuthentications=publickey [email protected] << EOT
cd ~/folder
echo "hello" > hello.txt
...
EOT
Upvotes: 5
Reputation: 509
Also, if you don't want to have a script available on the remote server, try the following:
ssh thehost 'cd /tmp; ls; echo Hello world, I am `hostname`'
and for SCP-less copying:
ssh localhost 'cat /bin/bash' > local_bash
Upvotes: 14
Reputation: 101299
Several people have already explained how to do the particular example you give better and easier.
If you really do need to script a remote interaction, you might consider using expect
.
Upvotes: 0
Reputation: 13468
You should use ssh
in this way to execute scripts on remote machines,
ssh user@server exec /path/to/script/script.sh
where script.sh
is available on the server on the given path from the user
login.
If the script is not present on the server but available on your local machine (and you do not have common NFS shared space between the two machines), you should send the script with scp
like this,
scp script.sh user@server:/path/to/script/
Now, for your specific case of getting a server file you should just execute,
scp user@server:/path/to/file/filename .
like some other answers already suggest.
Upvotes: 3
Reputation: 76770
ssh in a script doesn't work like that. However it does have the capability to execute a command on a remote server by specifying the command as an argument to ssh, like:
ssh [email protected] do_foo.sh
will run the do_foo.sh script on the server
However for your situation it looks like what you are really looking for is SCP.
Upvotes: 2
Reputation: 281855
You should be using scp ("secure copy") rather than ssh ("secure shell").
Upvotes: 14