linux - shell脚本在尝试执行sudo命令时给出 "sudo: no tty present and no askpass program specified"

标签 linux bash shell ubuntu

  • 我有一个 shell 脚本,它创建一个用户并以该用户身份执行另一个脚本

    sudo useradd -m devops
    sudo passwd devops
    sudo adduser devops sudo  
    su - devops -c "sh /path/to/myscript.sh"
    
  • 此脚本创建用户、设置密码并按预期将用户添加到 sudo 组。

  • myscript.sh 包含使用 sudo 权限的命令。 (sudo apt-get update、sudo apt-get install software-properties-common 等)。以及其他命令,如 ssh-keygen、curl 和 wget。
  • 除了带有 sudo 的命令之外的所有命令都可以正确执行并产生异常结果。
  • 但是具有 sudo 的命令会失败,并给出错误“不存在 tty 且未指定 Askpass 程序”
  • 为什么会出现这种情况?我该如何克服这个问题?
  • 我见过类似的问题,但如果我能在这方面得到明确的解释,我将不胜感激,谢谢。

最佳答案

尝试替换这个:

su - devops -c "sh /path/to/myscript.sh"

这样:

sudo -u devops -H sh -c "sh /path/to/myscript.sh"

su-c 选项不支持交互模式:

-c, --command COMMAND Specify a command that will be invoked by the shell using its -c.

The executed command will have no controlling terminal. This option cannot be used to execute interractive programs which need a controlling TTY.

(man su)

顺便说一句,我不会在脚本中到处使用sudo。该脚本可能只需要 root 权限。在脚本中,您可以在必要时通过上述 sudo 命令删除权限。

关于linux - shell脚本在尝试执行sudo命令时给出 "sudo: no tty present and no askpass program specified",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37022551/

相关文章:

Linux 脚本 - 日期操作

linux - ctrl+c 不杀死后台功能

linux - 如何使用文件名中的日期查找早于一个月的文件?

linux - 在我的配置文件中增加我的服务器端口

android - 如何使用adb shell将文件夹从计算机推送到sdcard

用于从列表中添加具有密码的用户的 Linux Shell 脚本

linux - 将 stderr 直接输出到 stdout $ command-name 2>&1 默认情况下,stderr 不会打印到终端吗?

linux - 带 Tun 接口(interface)的 I/O

bash - 为什么 rm 命令不删除文件?

c - 组织具有大量静态函数的 C 程序