Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何修复';sudo:不存在tty且未指定askpass程序';错误_Linux_Sudo_Tty - Fatal编程技术网

Linux 如何修复';sudo:不存在tty且未指定askpass程序';错误

Linux 如何修复';sudo:不存在tty且未指定askpass程序';错误,linux,sudo,tty,Linux,Sudo,Tty,我正在尝试使用makefile编译一些源代码。在makefile中,有一组命令需要作为sudo运行 当我从终端编译源代码时,一切正常,并且在第一次运行sudo命令等待密码时,make暂停。输入密码后,进行恢复并完成 但我希望能够在NetBeans中编译源代码。因此,我启动了一个项目,并向netbeans展示了在哪里可以找到源代码,但当我编译该项目时,它给出了一个错误: sudo: no tty present and no askpass program specified sudo: no

我正在尝试使用makefile编译一些源代码。在makefile中,有一组命令需要作为
sudo
运行

当我从终端编译源代码时,一切正常,并且在第一次运行
sudo
命令等待密码时,make暂停。输入密码后,进行恢复并完成

但我希望能够在NetBeans中编译源代码。因此,我启动了一个项目,并向netbeans展示了在哪里可以找到源代码,但当我编译该项目时,它给出了一个错误:

sudo: no tty present and no askpass program specified
sudo: no tty present and no askpass program specified
The remote script failed with exit code 1
第一次点击
sudo
命令时

我在互联网上查找了这个问题,我找到的所有解决方案都指向一件事:禁用此用户的密码。因为这里讨论的用户是root。我不想那样做


是否有其他解决方案?

sudo
默认情况下将从连接的终端读取密码。您的问题是从netbeans控制台运行时没有连接终端。因此,您必须使用另一种输入密码的方法:称为askpass程序

askpass程序不是特定的程序,而是可以请求密码的任何程序。例如,在我的系统中,
x11 ssh askpass
工作正常

为此,必须使用环境变量
SUDO\u ASKPASS
SUDO.conf
文件指定要使用的程序(有关详细信息,请参见
man SUDO

您可以使用选项
-A
强制
sudo
使用askpass程序。默认情况下,它将仅在没有连接的终端时使用它。

尝试:

ssh -t remotehost "sudo <cmd>"
ssh-t远程主机“sudo”

这将删除上述错误。

允许用户在不提示输入密码的情况下使用该命令应该可以解决问题。首先打开shell控制台并键入:

sudo visudo
然后编辑该文件以添加到末尾:

username ALL = NOPASSWD: /fullpath/to/command, /fullpath/to/othercommand
乙二醇

将允许用户
john
关闭sudo
电源,
启动
停止
,而无需提示输入密码

查看屏幕底部,查找在visudo中需要使用的按键-顺便说一下,这不是vi-并在出现任何问题的第一个迹象时退出而不保存。健康警告:损坏此文件将产生严重后果,请小心编辑

试试看:

ssh -t remotehost "sudo <cmd>"
  • 对所有命令使用
    NOPASSWD
    line,我的意思是:

    jenkins ALL=(ALL) NOPASSWD: ALL
    
  • 将该行放在
    sudoers
    文件中所有其他行之后


  • 这对我很有效(Ubuntu 14.04)。

    当您试图从一些非shell脚本运行终端命令(需要根密码)时,也可能会出现此错误,例如从Ruby程序运行sudo ls
    (在backticks中)。在这种情况下,您可以使用Expect实用工具()或其替代品。
    例如,在Ruby中,要执行
    sudo ls
    ,而不获取
    sudo:no tty present和no askpass程序,可以运行以下操作:

    require 'ruby_expect'
    
    exp = RubyExpect::Expect.spawn('sudo ls', :debug => true)
    exp.procedure do
        each do
            expect "[sudo] password for _your_username_:" do
                send _your_password_
            end
        end
    end
    

    [这使用了ExpectTCL扩展:ruby\u Expect gem]的替代方法之一。

    命令
    sudo
    失败,因为它试图提示根密码,并且没有分配伪tty(因为它是脚本的一部分)

    您需要以root用户身份登录以运行此命令,或者在
    /etc/sudoers中设置以下规则
    
    (或:
    sudo-visudo
    ):

    然后确保您的用户属于
    admin
    组(或
    wheel

    理想情况下(更安全)是将根权限仅限于可以指定为
    %admin ALL=(ALL)NOPASSWD:/path/to/program
    的特定命令尝试以下方法:

    echo '' | sudo -S my_command
    

    作为参考,如果其他人遇到相同的问题,我会在一个小时内遇到这个错误,这不应该发生,因为我使用的是NOPASSWD参数

    我不知道的是,当没有tty并且用户尝试启动的命令不是/etc/sudoers文件中允许的命令的一部分时,sudo可能会发出完全相同的错误消息

    以下是我的文件内容和我的问题的简化示例:

    bguser ALL = NOPASSWD: \
        command_a arg_a, \
        command_b arg_b \
        command_c arg_c
    
    当bguser尝试在没有任何tty的情况下启动“sudo command_b arg_b”(bguser用于某些守护进程)时,他将遇到错误“没有tty存在,也没有指定askpass程序”

    为什么?

    因为/etc/sudoers文件中的行尾缺少逗号


    (我甚至想知道这是否是预期的行为,而不是sudo中的错误,因为这种情况下正确的错误消息应该是“对不起,不允许用户bguser执行等”)

    确保您执行的命令
    sudo
    路径的一部分

    如果您有单个(或多个,但不是全部)命令
    sudoers
    条目,则当命令不是路径的一部分(且未指定完整路径)时,您将获得
    sudo:no tty present和no askpass程序

    您可以通过将命令添加到
    路径
    或使用绝对路径调用它来修复它,即

    sudo/usr/sbin/ipset

    而不是


    sudo ipset

    没有人告诉我们是什么导致了这个错误,在从一个主机迁移到另一个主机的情况下,请记住检查sudoers文件中的主机名:

    这是我的/etc/sudoers配置

    User_Alias      POWERUSER = user_name
    Cmnd_Alias SKILL = /root/bin/sudo_auth_wrapper.sh
    POWERUSER hostname=(root:root) NOPASSWD: SKILL
    
    如果不匹配

    uname -a
    Linux other_hostname 3.10.17 #1 SMP Wed Oct 23 16:28:33 CDT 2013 x86_64 Intel(R) Core(TM) i3-4130T CPU @ 2.90GHz GenuineIntel GNU/Linux
    
    它将弹出此错误:

    不存在tty,也未指定askpass程序


    登录到您的linux。按命令开火。要小心,因为编辑sudoer是一个危险的提议

    $ sudo visudo
    
    打开vi编辑器后,进行以下更改:

  • 注释掉
    Defaults requirety

    # Defaults    requiretty
    
  • 转到文件末尾并添加

    jenkins ALL=(ALL) NOPASSWD: ALL
    

  • 其他选项,不基于NOPASSWD:

    • 使用根权限启动Netbeans
      sudo -S <cmd>
      
      echo <password> | sudo -S <cmd> 
      
      jenkins ALL=NOPASSWD: systemctl
      
      jenkins ALL=NOPASSWD: /bin/systemctl
      
      echo '<your-password>' | sudo -S command
      
      echo '******' | sudo -S service nginx restart
      
      cat /etc/sudoers.d/README
      
      myuser  ALL=(ALL) NOPASSWD: ALL
      
      chmod 0440 /etc/sudoers.d/myuser
      
      echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
      
      RUN echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
      
      sshfs -o sftp_server="/usr/bin/sudo /usr/lib/openssh/sftp-server" user@my.server.tld:/var/www /mnt/sshfs/www
      
      sshfs -o debug -o sftp_server="/usr/bin/sudo /usr/lib/openssh/sftp-server" user@my.server.tld:/var/www /mnt/sshfs/www
      
      sudo: no tty present and no askpass program specified
      
      user ALL=NOPASSWD: /usr/lib/openssh/sftp-server
      
      myuser   ALL=(ALL) NOPASSWD: ALL
      %mygroup  ALL=(ALL:ALL) ALL
      
      myuser   ALL=(ALL) NOPASSWD: ALL
      
      chmod 777 filename
      
      sudo visudo
      
      www-data ALL=(ALL) NOPASSWD:ALL
      nobody ALL=(ALL) NOPASSWD:/ALL
      
      echo shell_exec('sudo -u the_user_of_the_file python your_file_name.py 2>&1');
      
      ps aux | grep python
      
      cut -d: -f1 /etc/passwd
      
      <USERNAME> ALL=(ALL) NOPASSWD: ALL
      
      Defaults visiblepw
      
      echo your_pswd | sudo -S your_cmd
      
      sudo -S cmd <<eof
      pwd
      eof
      #remember to put the above two lines without "any" indentations.
      
      gnome-terminal -e "sudo cmd"
      
      xterm -e "sudo cmd"
      
      sudo: no tty present and no askpass program specified
      The remote script failed with exit code 1
      
      sudo nano /etc/sudoers
      
      sudo visudo
      
      # Allow members to run all commands without a password
      my_user ALL=(ALL) NOPASSWD:ALL
      
      # Allow members to run specific commands without a password
      my_user ALL=(ALL) NOPASSWD:/bin/myCommand
      
      # Allow members to run specific commands without a password
      my_user ALL=(ALL) NOPASSWD: /bin/myCommand, /bin/myCommand, /bin/myCommand