尝试执行 sudo 命令时给出“sudo:不存在 tty 且未指定 askpass 程序”的 shell 脚本 [重复]

Posted

技术标签:

【中文标题】尝试执行 sudo 命令时给出“sudo:不存在 tty 且未指定 askpass 程序”的 shell 脚本 [重复]【英文标题】:shell script giving "sudo: no tty present and no askpass program specified" when trying to execute sudo command [duplicate] 【发布时间】:2016-08-29 14:03:38 【问题描述】:

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

sudo useradd -m devops
sudo passwd devops
sudo adduser devops sudo  
su - devops -c "sh /path/to/myscript.sh"

此脚本按预期创建用户、设置密码并将用户添加到 sudo 组。

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

【问题讨论】:

【参考方案1】:

尝试替换这个:

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

用这个:

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

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

-c, --command COMMAND 指定将被调用的命令 shell 使用它的 -c。

执行的命令将没有控制终端。这个选项 不能用于执行需要 控制 TTY。

(man su)

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

【讨论】:

谢谢,现在脚本可以工作了。但我不明白你答案的最后一部分。是的,许多命令需要 root 权限。使用 sudo 有什么问题? @user3356760,这不是什么大问题。如果“主”脚本主要是代表 root 编写的,那么最好为 root 省略 sudo,并要求用户以 root 权限运行脚本。此外,sudo 将用户的凭据缓存 5 分钟(如果在/etc/sudoers 中没有被timeout 覆盖);然后用户必须再次输入密码。因此,如果使用sudo 启动的进程运行时间超过timeout,则下一次sudo 调用将再次要求输入密码。 哦。我认为凭据将保留一个会话,直到用户退出。再次感谢。

以上是关于尝试执行 sudo 命令时给出“sudo:不存在 tty 且未指定 askpass 程序”的 shell 脚本 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Azure Batch 错误:“sudo:不存在 tty 且未指定 askpass 程序”

Jenkins sudo:不存在 tty,也没有使用 NOPASSWD 指定 askpass 程序 [重复]

如何在 shell 脚本中使用 tee 和 sshpass

Ubuntu执行命令时,不sudo提示权限不足,sudo提示找不到该命令

linux命令 之 sudo命令详细介绍

当我尝试使用雪花存储过程执行更改命令时给出错误?