V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
Jamy
V2EX  ›  Linux

如何给 sh -c "echo $1,$2" 传递参数。

  •  
  •   Jamy · 2023-01-11 21:32:18 +08:00 · 1893 次点击
    这是一个创建于 681 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一段 shell 脚本,不想写到文件再去执行,如何传递参数?

    15 条回复    2023-01-13 15:41:20 +08:00
    hsfzxjy
        1
    hsfzxjy  
       2023-01-11 21:33:01 +08:00 via Android
    写成 shell 函数?
    h0099
        2
    h0099  
       2023-01-11 21:36:16 +08:00   ❤️ 1
    https://unix.stackexchange.com/questions/144514/add-arguments-to-bash-c
    第一个回答的机翻:

    /bin/bash -c 'echo "$0" "$1"' foo bar
    /bin/bash -c 'echo "$@"' bash foo bar
    在第一种情况下,显式传递 echo 参数$0 和$1 ,在第二种情况下,使用"$@"to 正常扩展为“除 $0 之外的所有位置参数”。请注意,在这种情况下,我们也必须传递一些要使用的东西$0 ;我选择了“bash”,因为这$0 通常是什么,但其他任何东西都可以。

    至于这样做的原因,而不是仅仅将您直接提供的任何参数传递给您列出的命令:请注意文档说“命令是从字符串中读取的”,复数形式。换句话说,这个方案允许你做:

    /bin/bash -c 'mkdir -p -- "$1" && cd -P -- "$1" && touch -- "$2"' bash dir file
    ab
        3
    ab  
       2023-01-11 21:36:51 +08:00
    bash test.sh abc 123
    ab
        4
    ab  
       2023-01-11 21:38:20 +08:00
    抱歉没注意到是不想写到文件
    Nooooobycat
        5
    Nooooobycat  
       2023-01-11 21:39:58 +08:00
    man xargs
    Jamy
        6
    Jamy  
    OP
       2023-01-11 21:58:49 +08:00
    @h0099
    非常感谢,果然可以!
    sh -c 'echo $1 $2 $3 $4 $5' sh 1 2 3 4 5
    webcape233
        7
    webcape233  
       2023-01-11 22:30:05 +08:00 via iPhone
    我寻思这不就是直接写完事吗?还用想啥特殊办法

    a=1 ; sh -c "echo $a"
    1
    webcape233
        8
    webcape233  
       2023-01-11 22:33:24 +08:00 via iPhone
    搞不懂既然不写文件,直接在终端的,传参意义是啥,先声明再调用不一样? 为啥要用 sh -c 呢
    h0099
        9
    h0099  
       2023-01-11 22:42:07 +08:00
    @webcape233 估计他复制粘贴来的 bash 里有一大堆的$1 $2 $3 $4 $5 $6 $7 $8 $9 他懒得查找替换,而您又不可能声明 1=a ( bash 变量名不能数字开头)
    Jamy
        10
    Jamy  
    OP
       2023-01-12 18:53:33 +08:00
    @h0099 由于安全原因,脚本文件是加密的, 有一个 c 写的程序来调用, 解密完成之后就要立即执行.这时候不方便写个文件再删除了
    Jamy
        11
    Jamy  
    OP
       2023-01-12 18:54:46 +08:00
    @webcape233 是有 C 程序来调用的,并非在终端下执行
    Jamy
        12
    Jamy  
    OP
       2023-01-12 19:12:59 +08:00
    鉴于大家对于这个需求的疑惑, 我再解释下需求吧.
    由于安全原因,需要把正常的 shell 脚本(encrypt.sh)用 aes 加密,
    然后再用 C 写一个程序来(shc)来执行这个加密的 shell 文件.
    要实现的效果就是调用 shc encrypt.sh 1 2 3 可能正常执行脚本.

    根据#2 楼 @h0099 指点,最终的 shc 的实现过程大概如下
    ```c
    int main(int argc, char* argv[]) {
    char* nargv[32] = {0};
    char *decrpytShell = "echo $1 $2";
    nargv[0] = argv[0];
    nargv[1] = "-c";
    nargv[2] = decrpytShell ;
    nargv[3] = argv[0];

    for(int i = 2; i < argc; ++i)
    nargv[i + 2] = argv[i];

    return execvp("/usr/bin/sh", nargv);
    }
    ```
    h0099
        13
    h0099  
       2023-01-12 19:46:32 +08:00
    那您 c 写的 shc 解密程序里不也有 aes 加密时的密钥吗?您在同一个机器上加密又解密一坨 bash 字符串有啥意义?
    除非您是在执行别人发给您的 bash ,而为了信任对方发送的 bash 的确是他亲自发的所以套了层 GPG
    Jamy
        14
    Jamy  
    OP
       2023-01-13 09:47:27 +08:00
    @h0099 肯定是分发到不信任的环境里执行的啊,shc 又经过混淆加密处理,看他破解能力了.
    h0099
        15
    h0099  
       2023-01-13 15:41:20 +08:00
    所以拥有 aes 解密密钥的 shc 程序并不位于`不信任的环境`之中?
    shc 只是负责解密变回合法 bash 字符串后把 bash 字符串传给`不信任的环境`来 eval ?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1037 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 566ms · UTC 23:00 · PVG 07:00 · LAX 15:00 · JFK 18:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.