UNIX ssh script, running commands on remote server

2020-02-26 12:25发布

问题:

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 brjones@server.com
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.

回答1:

You should be using scp ("secure copy") rather than ssh ("secure shell").



回答2:

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


回答3:

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 brjones@server.com << EOT
cd ~/folder
echo "hello" > hello.txt
...
EOT


回答4:

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.



回答5:

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 brjones@server.com 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.



回答6:

In addition to the answer by Tiemen, of course you can pipe the commands from your local script with:

ssh thehost < commands.sh


回答7:

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.



回答8:

Why not use scp?



回答9:

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.



回答10:

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"