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

2023-01-11 21:32:18 +08:00
 Jamy

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

1737 次点击
所在节点    Linux
15 条回复
hsfzxjy
2023-01-11 21:33:01 +08:00
写成 shell 函数?
h0099
2023-01-11 21:36:16 +08:00
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
2023-01-11 21:36:51 +08:00
bash test.sh abc 123
ab
2023-01-11 21:38:20 +08:00
抱歉没注意到是不想写到文件
Nooooobycat
2023-01-11 21:39:58 +08:00
man xargs
Jamy
2023-01-11 21:58:49 +08:00
@h0099
非常感谢,果然可以!
sh -c 'echo $1 $2 $3 $4 $5' sh 1 2 3 4 5
webcape233
2023-01-11 22:30:05 +08:00
我寻思这不就是直接写完事吗?还用想啥特殊办法

a=1 ; sh -c "echo $a"
1
webcape233
2023-01-11 22:33:24 +08:00
搞不懂既然不写文件,直接在终端的,传参意义是啥,先声明再调用不一样? 为啥要用 sh -c 呢
h0099
2023-01-11 22:42:07 +08:00
@webcape233 估计他复制粘贴来的 bash 里有一大堆的$1 $2 $3 $4 $5 $6 $7 $8 $9 他懒得查找替换,而您又不可能声明 1=a ( bash 变量名不能数字开头)
Jamy
2023-01-12 18:53:33 +08:00
@h0099 由于安全原因,脚本文件是加密的, 有一个 c 写的程序来调用, 解密完成之后就要立即执行.这时候不方便写个文件再删除了
Jamy
2023-01-12 18:54:46 +08:00
@webcape233 是有 C 程序来调用的,并非在终端下执行
Jamy
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
2023-01-12 19:46:32 +08:00
那您 c 写的 shc 解密程序里不也有 aes 加密时的密钥吗?您在同一个机器上加密又解密一坨 bash 字符串有啥意义?
除非您是在执行别人发给您的 bash ,而为了信任对方发送的 bash 的确是他亲自发的所以套了层 GPG
Jamy
2023-01-13 09:47:27 +08:00
@h0099 肯定是分发到不信任的环境里执行的啊,shc 又经过混淆加密处理,看他破解能力了.
h0099
2023-01-13 15:41:20 +08:00
所以拥有 aes 解密密钥的 shc 程序并不位于`不信任的环境`之中?
shc 只是负责解密变回合法 bash 字符串后把 bash 字符串传给`不信任的环境`来 eval ?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/908261

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX