Nemo 操作错误:sudo:不存在 tty 并且未指定 Askpass 程序

Nemo 操作错误:sudo:不存在 tty 并且未指定 Askpass 程序

我得到了以下 bash 脚本来在我的机器上挂载共享:

#!/bin/bash
BA_LAST_OCTET=144
BA_IP=$(ip route get 8.8.8.8 | awk 'NR==1 {print $NF}' | awk -F'.' '{print $1,$2,$3"."}' OFS='.')$BA_LAST_OCTET
PROMPT="Sudo password: "

CAN_I_RUN_SUDO=$(sudo -n uptime 2>&1|grep "load"|wc -l)
if [ ${CAN_I_RUN_SUDO} -le 0 ]
then
    . getpass.sh $1 

    echo $PASSWORD | sudo -S : >/dev/null 2>&1
fi
OUTPUT=$(sudo mount.cifs //$BA_IP/huginn/ /mnt/huginn/ -o username=fileshare,password="",rw,file_mode=0777,dir_mode=0777 2>&1)
if [ -z "$OUTPUT" ]; then
    HUGINN="Huginn... Mounted."
else

    HUGINN="Huginn... Error.\n"$OUTPUT
fi
OUTPUT=$(sudo mount.cifs //$BA_IP/muninn/  /mnt/muninn/ -o username=fileshare,password="",rw,file_mode=0777,dir_mode=0777 2>&1)
if [ -z "$OUTPUT" ]; then
    MUNINN="Muninn... Mounted."
else

    MUNINN="Muninn... Error.\n"$OUTPUT
fi
MSG=$HUGINN"\n"$MUNINN"\nFinalized."
if [[ $1 == "--gui" ]] ; then
    zenity --info --title="Blackarmor" --text="$MSG"  2>/dev/null
else
    echo -e  "Mounting  Blackarmor shares... \n\n"$MSG
fi

它在命令行下运行得非常好。但如果我尝试在 Nemo Action 中使用它,它会显示以下消息:

Huginn... Error.
sudo: no tty present and no askpass program specified
Muninn... Error.
sudo: no tty present and no askpass program specified
Finalized.

. getpass.sh只需从 gui 或命令行获取密码并将其放入 PASSWORD var 中。即使在 Nemo Action 中也能正常工作(我测试过)。

尼莫动作看起来像这样:

[Nemo Action]
Active=true
Name=Mount Blackarmor share
Exec=/bin/bash /usr/bin/ba --gui
Selection=Any
Extensions=any;

有人知道我该如何解决这个问题吗?

我也接受有关如何以更好的方式运行它的建议。如果我尝试在桌面上创建指向此脚本的启动器而不选中“在终端中启动”选项,则会发生同样的问题。

编辑

正如@meuh 所建议的,我尝试改变这一点:

. getpass.sh $1 

echo $PASSWORD | sudo -S : >/dev/null 2>&1

对此:

 #. getpass.sh $1

 SUDO_ASKPASS=/usr/bin/ssh-askpass sudo -A : >/dev/null 2>&1

但它显示了完全相同的消息。 ssh-askpass 是 x11-ssh-askpass 的 Ubuntu/Mint 版本(我使用 Mint)。请记住,如果我选中“在终端中启动”,它就可以在启动器中运行。但我真的不喜欢后面出现的大窗口,而且它也不能作为尼莫动作使用,这会更好。

答案1

您可以要求运行现有的命令,而不是编写自己的密码获取命令sudo,例如x11-ssh-askpass我的 Fedora 系统上的同名程序包中的命令。你会说

SUDO_ASKPASS=/usr/libexec/openssh/x11-ssh-askpass sudo -A somecommand

它会弹出一个图形用户界面让你输入密码。

或者,您可以降低安全性并允许sudo在没有 tty 时运行命令,方法是编辑 sudoers 文件sudo visudo /etc/sudoers(注意:在某处保留 root 登录名,以便在需要时救援您)并添加一行:

Defaults:myname !requiretty

作为您的用户名我的名字


如果您需要一个 tty,您可以使用一个程序,例如script在运行命令时提供一个 tty,例如:

script <<<'SUDO_ASKPASS=/... sudo -A mycommand'

您可能需要用 包围整个脚本script,否则每次都会得到一个新的 tty,并且sudo每次都会要求您输入密码。

相关内容