In my .bashrc
I define a function which I can use on the command line later:
function mycommand() {
ssh [email protected] cd testdir;./test.sh "$1"
}
When using this command, just the cd
command is executed on the remote host; the test.sh
command is executed on the local host. This is because the semicolon separates two different commands: the ssh
command and the test.sh
command.
I tried defining the function as follows (note the single quotes):
function mycommand() {
ssh [email protected] 'cd testdir;./test.sh "$1"'
}
I tried to keep the cd
command and the test.sh
command together, but the argument $1
is not resolved, independent of what I give to the function. It is always tried to execute a command
./test.sh $1
on the remote host.
How do I properly define mycommand
, so the script test.sh
is executed on the remote host after changing into the directory testdir
, with the ability to pass on the argument given to mycommand
to test.sh
?
Reviving an old thread, but this pretty clean approach was not listed.
function mycommand() {
ssh [email protected] <<+
cd testdir;./test.sh "$1"
+
}
I'm using the following to execute commands on the remote from my local computer:
ssh -i ~/.ssh/$GIT_PRIVKEY user@$IP "bash -s" < localpath/script.sh $arg1 $arg2
This is an example that works on the AWS Cloud. The scenario is that some machine that booted from autoscaling needs to perform some action on another server, passing the newly spawned instance DNS via SSH
# Get the public DNS of the current machine (AWS specific)
MY_DNS=`curl -s http://169.254.169.254/latest/meta-data/public-hostname`
ssh \
-o StrictHostKeyChecking=no \
-i ~/.ssh/id_rsa \
[email protected] \
<< EOF
cd ~/
echo "Hey I was just SSHed by ${MY_DNS}"
run_other_commands
# Newline is important before final EOF!
EOF
Source: Stackoverflow.com