【问题标题】:Prompt for `sudo` only if Bash script runs into "Permission denied"仅当 Bash 脚本遇到“权限被拒绝”时才提示“sudo”
【发布时间】:2013-08-19 22:38:09
【问题描述】:

假设我有一个非常简单的脚本,它在某个目录中创建一个链接,如果失败则终止该脚本。

ln -s "/opt/myapp" "${1}/link" || exit 1;

现在,如果遇到错误,它就会退出。我想更改它,只有在创建链接时遇到权限错误,它才会执行以下行而不是退出:

echo "The target directory requires root privileges to access."
sudo ln -s "/opt/myapp" "${1}/myapp" || exit 1;

我不想提示用户以 root 身份运行,除非他们绝对必须这样做。


ln 似乎在失败时返回退出代码 1,无论是权限问题还是任何其他错误(例如目录不存在),所以我无法使用它来检测它遇到的问题。

如果我改为通过 ln 的输出存储对字符串“Permission denied”的搜索,我假设它在非英语操作系统上会失败。

【问题讨论】:

    标签: bash shell file-permissions


    【解决方案1】:

    我不知道有任何方法可以对 ln 退出原因进行分类,或者至少没有任何关于您可以使用 $? 测试的特定退出代码的文档,但您可以使用标准 test or [ command 测试相关权限:

    SOURCEFILE="/opt/myapp"
    DESTDIR="${1}"
    DESTTARGET="${DESTDIR}/myapp"
    
    if [ ! -d "$DESTDIR" -o ! -e "$SOURCEFILE" ]; then
      echo "Source file does not exist or destination directory does not exist." >&2
    elif [ ! -r "$SOURCEFILE" -o ! -w "$DESTDIR" ]; then
      echo "Source file is not readable or destination directory is not writable." >&2
      # Run sudo command here
    else
      # Should work, run command here
    fi
    

    【讨论】:

      猜你喜欢
      • 2021-12-11
      • 2015-04-09
      • 2016-07-15
      • 2016-07-16
      • 2011-08-14
      • 2022-01-03
      • 1970-01-01
      • 2012-08-29
      • 2014-06-18
      相关资源
      最近更新 更多