【问题标题】:Bash: String variable that includes literal single quotesBash:包含文字单引号的字符串变量
【发布时间】:2013-07-23 15:02:13
【问题描述】:

只是试图让mysqldump 脚本使用包含空格的备份用户密码;如果我有选择,我会改变它,但我没有。

Head 正忙着整理 Bash 和引号的奇妙世界,只需要执行以下操作...

mysql -u backupuser -p'This is a terrible password with spaces' -e ...

...但是用一个变量代替:

MYPASS="'This is a terrible password with spaces'"

mysql -u backupuser -p$MYPASS -e ...

【问题讨论】:

    标签: bash quotes string-literals


    【解决方案1】:

    通过命令行传递密码被认为是不安全的,因为其他用户可以使用ps afx/proc 文件系统以纯文本形式看到密码。我最近就这个话题写了blog post

    但是,为了使命令正常工作,它需要在 $MYPASS 周围加上双引号 ",以防止 bash 将空格分隔的密码解释为多个参数:

    MYPASS="foo bar password"
    mysql -u backupuser -p"$MYPASS" -e ...
    

    但我强烈推荐如下解决方案,它使用expect 将密码传递给mysqldump

    #!/bin/bash
    
    # mysql credentials and connection data
    db_host="localhost"
    db_name="testdb"
    db_user="jon"
    db_pass="secret"
    
    # I'm using a here-document to pass commands to expect. 
    # (the commands could be stored in a file as well)
    expect <<EOF
    # disable command output
    log_user 0
    # start the mysqldump process
    spawn mysqldump -h$db_host -u$db_user -p $db_name
    # wait for the password prompt
    expect "password:"
    # send the password (mind the \r)
    send "$db_pass\r"
    # enable output again
    log_user 1
    # echo all outout until the end
    expect eof
    EOF
    

    expect 将像人类用户一样传递密码:在提示输入密码后,它将密码写入mysqldump 的标准输入。如果您确保其他用户无法访问 except 脚本,他们将无法以纯文本形式查看密码。

    【讨论】:

    • 讨厌吹毛求疵,但你能澄清一下“使用 cat 和 here 文档一起传递...”的评论吗?
    • @gravyface 你有没有在没有编辑器的情况下使用cat &lt;&lt;EOF &gt; file 在命令行上编写文件?我问是因为如果你知道你就会明白我的意思。顺便说一句,我承认即使没有cat 也可以只使用 here-doc。
    • 我没有。只是“这里”这句话就让我失望了。
    • @gravyface 我已经更正了拼写。 (我不是母语人士)现在更容易理解了吗?
    • 啊,好吧,所以“这里”是一个口语/非正式术语。不确定你的意思;好像少了一个字。
    【解决方案2】:

    我会去的

    mysql -u backupuser -p -e ...
    

    并在提示符处提供密码,而不是将其放入 cmdline 参数中。

    如果您将密码指定为mysql 的参数,则几乎每个在您运行脚本时登录到计算机的用户都可以使用简单的ps aux 获取密码

    【讨论】:

    • 如果需要输入密码,很难自动化。 expect 将在这里提供帮助。检查我的答案
    • @hek2mgl 是的,尽管 OP 并没有真正说明脚本的用途。我主要想指出的是,使用 OP 建议的密码本质上是不安全的。是的,如果您需要脚本自己运行,expect 是一个很好的解决方案。
    • 好的。如果脚本不应该被自动调用,这意味着它只是被认为是交互式使用,那么您的解决方案是最好的,因为它根本不需要以纯文本形式存储密码.. +1 ;) 但正如用户所说备份问题,我不希望它用于交互式使用。但是,我们目前还不知道
    猜你喜欢
    • 2017-06-06
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    相关资源
    最近更新 更多