我使用以下脚本
#!/bin/bash
echo 'Please enter the password of your XXXX:'
read -sp 'Password:' password
screen -dm bash -c ' BLABLA '
问题是我在 BLABLA 中的命令包含参数密码 ( $password
) 并且$password
未传递到引号内''
我需要引号,以便我可以在屏幕中执行条件语句...' if ... then ...; fi
'
最好的,V
答案1
要正确地将$password
参数传递给bash -c
,
screen -dm bash -c 'if [ "$1" = "somestring" ]; then echo ok; fi' bash "$password"
注意事项:
shell 选项的选项参数
-c
应该是单引号字符串。如果不是,并且您向其中注入变量,则会出现代码注入漏洞。第一个非选项参数是任意字符串
bash
。这将是在脚本$0
内部给出的值bash -c
,并将在该 shell 生成的任何错误消息中使用。通常使用 shell 的名称作为该字符串。其余参数将放置在位置参数列表中,即 into等
$1
。$2
在这种情况下,我们传递一个参数,即带引号的密码字符串。这最终出现在脚本$1
内部bash -c
。
请注意 Stéphane 对这个问题的评论,在命令行上传递密码本质上是不安全的。这是因为命令的参数在进程列表中可见,并且在某些情况下可能存储在审核日志和 shell 历史文件中。凭证有时会存储在具有限制性权限的文件中,并且可以在bash -c
。既然我不知道确切地你想要做什么,我无法展示任何有用的例子。
另请注意,要正确读取任意字符串,IFS
变量应具有空字符串作为值,否则它将从输入中删除一些空白字符。您还需要read -r
允许正确输入反斜杠字符。
IFS= read -s -p 'password: ' -r password
您使用的首字母echo
应该写入标准错误流,因为它是对用户的提示,
echo 'Please enter the password of your XXXX:' >&2