有一段 shell 脚本,不想写到文件再去执行,如何传递参数?
1
hsfzxjy 2023-01-11 21:33:01 +08:00 via Android
写成 shell 函数?
|
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 |
4
ab 2023-01-11 21:38:20 +08:00
抱歉没注意到是不想写到文件
|
5
Nooooobycat 2023-01-11 21:39:58 +08:00
man xargs
|
7
webcape233 2023-01-11 22:30:05 +08:00 via iPhone
我寻思这不就是直接写完事吗?还用想啥特殊办法
a=1 ; sh -c "echo $a" 1 |
8
webcape233 2023-01-11 22:33:24 +08:00 via iPhone
搞不懂既然不写文件,直接在终端的,传参意义是啥,先声明再调用不一样? 为啥要用 sh -c 呢
|
9
h0099 2023-01-11 22:42:07 +08:00
@webcape233 估计他复制粘贴来的 bash 里有一大堆的$1 $2 $3 $4 $5 $6 $7 $8 $9 他懒得查找替换,而您又不可能声明 1=a ( bash 变量名不能数字开头)
|
10
Jamy OP @h0099 由于安全原因,脚本文件是加密的, 有一个 c 写的程序来调用, 解密完成之后就要立即执行.这时候不方便写个文件再删除了
|
11
Jamy OP @webcape233 是有 C 程序来调用的,并非在终端下执行
|
12
Jamy OP 鉴于大家对于这个需求的疑惑, 我再解释下需求吧.
由于安全原因,需要把正常的 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); } ``` |
13
h0099 2023-01-12 19:46:32 +08:00
那您 c 写的 shc 解密程序里不也有 aes 加密时的密钥吗?您在同一个机器上加密又解密一坨 bash 字符串有啥意义?
除非您是在执行别人发给您的 bash ,而为了信任对方发送的 bash 的确是他亲自发的所以套了层 GPG |
15
h0099 2023-01-13 15:41:20 +08:00
所以拥有 aes 解密密钥的 shc 程序并不位于`不信任的环境`之中?
shc 只是负责解密变回合法 bash 字符串后把 bash 字符串传给`不信任的环境`来 eval ? |