0

我创建了一个包装器,它可以使用以下参数通过 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 

以一般的方式。

4

2 回答 2

4

使用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删除了前三个参数。

于 2012-07-31T09:56:20.817 回答
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"

例如 - 登录到远程服务器并打印日期并获取正在运行的进程列表

$ ssh user@server "echo date; ps -ef | grep hello"

您可以将上述逻辑添加到脚本中,假设您想将其作为ssh-wrapper的一部分调用,或者直接从命令行执行。

只需确保在 ssh 部分使用“双引号”而不是“单引号”。

于 2012-07-31T10:19:06.067 回答