我创建了一个包装器,它可以通过SSH使用以下参数执行给定的脚本
sshwrapper.sh <server> <script with path> <username> <password>
现在我想调用以下脚本:
start.sh param1 param2 param3 param4
stop.sh param1 param2 param3
使用相同的包装器。
是否有可能有一种机制,在将基本参数传递给包装器脚本后,我可以将剩余参数发布到底层脚本?
即。我想达到以下符号:
示例:
sshwrapper.sh server start.sh username password param1 param2 param3 param4
应该调用
start.sh param1 param2 param3 param4
和
sshwrapper.sh server stop.sh username password param1 param2 param3
应该调用
stop.sh param1 param2 param3
以通用的方式。
答案 0 :(得分:3)
使用shift
和"$@"
:
SERVER="$1"
SCRIPT="$2"
USERNAME="$3"
PASSWORD="$4"
shift 4
"$SCRIPT" "$@"
示例:
$ cat sshwrapper.sh
#!/bin/sh
SERVER="$1"
SCRIPT="$2"
USERNAME="$3"
PASSWORD="$4"
shift 4
echo "$SCRIPT" "$@"
$ ./sshwrapper.sh server stop.sh username password param1 param2 param3
stop.sh param1 param2 param3
使用shift
,您可以从命令行中删除第一个参数并转移其余参数:
$ set 1 2 3 4 5
$ echo "$@"
1 2 3 4 5
$ shift 3
$ echo "$@"
4 5
您在此处看到shift 3
删除了前三个参数。
答案 1 :(得分:2)
我以前曾使用ssh在远程服务器上执行脚本,但为了让我的生活轻松,我设置了公钥认证,以允许无密码访问。
请参阅此文章以供参考
http://macnugget.org/projects/publickeys/
您可以使用命令行中的默认ssh工具执行带参数的远程脚本,如下所示
$ ssh user@server "script.sh param1 param2 param3"
可以按如下方式执行多个命令
$ ssh user@server "script1.sh param1 param2 param3; script2.sh param1 param2 param3"
E.g - 登录远程服务器并打印日期并获取正在运行的进程列表
$ ssh user@server "echo date; ps -ef | grep hello"
您可以将以上逻辑添加到脚本中,假设您要将其作为 ssh-wrapper 的一部分来调用,或者直接从命令行执行。
请确保在ssh部分使用“双引号”而不是'single'。