【问题标题】:how to pass parametes to the shell script如何将参数传递给shell脚本
【发布时间】:2021-01-20 08:57:59
【问题描述】:

我有一些别名:

alias a1='ssh -A -t -p 22 user1@10.62.0.20 ssh user2@10.62.0.100'

我有一些 shell 脚本 s1.sh,它获取不同的参数。 这个参数我需要通过变量:$args

args="a1 b2 c3 d4"
cat s1.sh | a1 "sudo su - user3; /bin/sh -s $args"

此代码有效,脚本已执行,但未将参数“/bin/sh -s $args”传递给 s1.sh 脚本。 本例中如何传递“$args”变量?

【问题讨论】:

  • cat 将简单地打印脚本文件中的命令并在远程机器上执行它们,它将无法解释参数。您需要将脚本 scp 到远程计算机,然后执行附加参数,
  • @barmaley :您的别名定义不包含任何可以扩展的内容。因此,a1 foo bar 只是将foo bar 附加到别名定义的内容中。
  • 你应该使用函数,而不是别名。您也可能不需要,因为您可以简单地在 .ssh 配置中指定所有必要的标志和选项。

标签: shell unix sh


【解决方案1】:

试试:

alias a1='ssh -A -t -p 22 -J user1@10.62.0.20 user2@10.62.0.100'
< s1.sh a1 "sudo -u user3 /bin/sh -s $args"

或更好:

args=(a1 b2 c3 d4)
< s1.sh a1 "sudo -u user3 /bin/sh -s $(printf "%q " "{args[@]}"
# or double-escape, I am never sure in ssh-ing:
< s1.sh a1 "sudo -u user3 /bin/sh -s $(printf "%q" "$(printf "%q " "{args[@]}")")"

使用ssh ... ssh .. sudo su sh,您将像 4 次重新评估输入一样。

你的sh -s $args 也被完全忽略了——所有输入都被sudo 启动的shell 吃掉了,然后sh -s 什么都没有了。此外,sudo su 类似于 echo $(echo $(echo)))。已经有sudo,所以用sudo更改用户。

【讨论】:

    【解决方案2】:

    谢谢大家..

    我找到了解决办法。

    此命令不起作用:

    cat s1.sh | a1 "sudo su - user3; /bin/sh -s $args"
    

    这个命令有效:

    cat s1.sh | a1 "sudo -i -u user3 /bin/sh -s $args"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-08
      • 2021-04-16
      • 2019-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多