I need to execute a shell script remotely inside the Linux box from Windows
#!/bin/bash
if [ "$#" -ne 1 ]; then
echo "Illegal number of parameters"
exit
fi
echo "$1"
Here is the command I ran from Windows command prompt
cmd> plink.exe -ssh username@host -pw gbG32s4D/ -m C:\myscript.sh 5
I am getting output as
"Illegal number of parameters"
Is there any way I can pass command line parameter to shell script which will execute on remote server?
Have you tried putting the command and argument in quotes:
i.e. -m "C:\myscript.sh 5"
You misunderstand how the
-m
switch works.It is just a way to make
plink
load the commands to send to the server from a local file.The file is NOT uploaded and executed on the remote server (with arguments).
It's contents is read locally and sent to the server and executed there as if you typed it on a (remote) command line. You cannot give it arguments.
A workaround is to generate the file on the fly locally before running
plink
from a batch file (sayrun.bat
):Then run the batch file with the argument:
The above will make the script execute
echo 5
on the server.If the script is complex, instead of assembling it locally, have it ready on the server (as @MarcelKuiper suggested) and execute just the script via Plink.
In this case, as we execute just one command, you can pass it on Plink command line, including the arguments. You do not have to use the
-m
switch with a (temporary) file.I triggered the Shell script in "commands.txt" from Plink which worked for me like a charm with below method I tried:
Note: Use first EOF in quote like <<'EOF' but not the last one. Else you will see you code will behave weirdly. Please see below.
Example:
Then, finally run it using Plink: