In my .bashrc
I define a function which I can use on the command line later:
function mycommand() {
ssh user@123.456.789.0 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 user@123.456.789.0 '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
?
6条答案
按热度按时间vmpqdwk31#
Do it this way instead:
You still have to pass the whole command as a single string, yet in that single string you need to have
$1
expanded before it is sent to ssh so you need to use""
for it.Update
Another proper way to do this actually is to use
printf %q
to properly quote the argument. This would make the argument safe to parse even if it has spaces, single quotes, double quotes, or any other character that may have a special meaning to the shell:function
,()
is not necessary.Starting Bash version 4.4, it can also be simplified to this:
See
${parameter@operator}
section in Shell Parameter Expansion.avwztpqn2#
我正在使用以下命令从本地计算机在远程计算机上执行命令:
4xrmg8kj3#
这是一个在AWS云上运行的示例。场景是从自动缩放启动的某台机器需要在另一台服务器上执行某个操作,通过SSH传递新生成的示例DNS
kuhbmx9i4#
恢复一个旧线程,但这个相当干净的方法没有列出。
eblbsuwk5#
给我一个小技巧,使用"bash-s",他们说他们允许位置参数,但显然0美元已经保留了无论什么原因...然后使用两次相同的参数岩石如下:
jm2pwxwz6#
Solution: you want to be able connect to machine remotely using ssh protocol and trigger/run some actions outside.
on ssh use a
-t
flag, from documentation:-t Force pseudo-terminal allocation.
This can be used to execute arbitrary screen-based programs on a remote machine, which can be very useful, e.g.
when implementing menu services. Multiple -t options force tty allocation, even if ssh has no local tty.
formula:
Example: as administrator I want to be able to connect remotely into ec2 machines and trigger a revert process for a bad deployment on a several machines in a raw, moreover you better implement this action as an automation script that use ips as an arguments and running on different machines in parallel.