在引号内传递参数,例如 screen -dm ' ls /home/$dir1 '

在引号内传递参数,例如 screen -dm ' ls /home/$dir1 '

我使用以下脚本

#!/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

相关内容