我得到了以下 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
每次都会要求您输入密码。