【问题标题】:Unable to automate script: sudo: no tty present and no askpass program specified无法自动化脚本:sudo:不存在 tty,也没有指定 askpass 程序
【发布时间】:2015-02-01 09:16:33
【问题描述】:

我想自动化构建 - 目前,在我的开发过程中,因此不涉及安全问题。

我创建了一个脚本,将库移动到/usr/local/lib 并发出ldd 命令。

这些东西需要 sudo。

从构建器(Qt Creator)运行脚本,我没有被提示输入我的 sudo 密码,我得到了错误

sudo: no tty present and no askpass program specified
Sorry, try again.

我已经找到了一些solutions,但它只是没有用......我错过了什么?

具体代码:

in myLib.pro

#temporary to make my life easier
QMAKE_POST_LINK = /home/me/move_libs_script

in move_libs_script:

#!/bin/bash 
sudo cp $HOME/myLib/myLib.so.1 /usr/local/lib/
sudo ldconfig

我按照上面答案的建议做了:编辑了 visudo 并添加了脚本...甚至添加了 qmake...

sudo visudo

added at the end:

me ALL=NOPASSWD: /home/me/move_libs_script, /usr/bin/qmake-qt4

它保存了文件:/etc/sudoers.tmp(然后再次执行命令sudo visudo,我看到我的更改被保留了,所以我不确定 tmp 是什么)

还是一样的错误

sudo: no tty present and no askpass program specified
Sorry, try again.
sudo: no tty present and no askpass program specified
Sorry, try again.
sudo: no tty present and no askpass program specified
Sorry, try again.
sudo: 3 incorrect password attempts
sudo: no tty present and no askpass program specified
Sorry, try again.
sudo: no tty present and no askpass program specified
Sorry, try again.
sudo: no tty present and no askpass program specified
Sorry, try again.
sudo: 3 incorrect password attempts

编辑:在提出问题后,我发现了一个建议的类似问题: https://stackoverflow.com/a/10668693/1217150

所以我尝试添加自定义步骤...

结果:

09:50:03: Running build steps for project myLib...
09:50:03: Could not start process "ssh-askpass Sudo Password | sudo -S bash ./move_libs_script" 
Error while building project myLib (target: Desktop)
When executing build step 'Custom Process Step'

(如果我从终端运行,我会被要求输入密码)

新编辑:所以我认为我可以超越系统并调用调用我的脚本的脚本...

myLib.pro

QMAKE_POST_LINK = /home/me/sudo_move_libs_script

sudo_move_libs_script:

#!/bin/bash 
ssh-askpass Sudo Password | sudo -S bash $HOME/move_libs_script

知道了!!!我猜我会发布答案

新编辑作为评论的答案:

in mainExe.pro:

QMAKE_POST_LINK = ./link_lib

in link_lib:

#!/bin/sh
LD_LIBRARY_PATH=$HOME/myLib
export LD_LIBRARY_PATH

结果:可执行文件失败,因为找不到库(当然在测试之前我从 /usr/local/lib 删除了副本)

【问题讨论】:

  • 您在sudoers 中列出的命令是可以与sudo 一起使用的命令。不是命令/脚本/等。那将调用sudo。您是否安装了ssh-askpass 程序?
  • 刚刚编辑了我从终端测试的,它可以从那里工作
  • 自定义命令的环境可能没有正确设置DISPLAY环境变量,无法显示窗口。
  • 如何检查是否是这种情况,如果是,我该如何解决? (我刚刚尝试的另一种解决方法失败了)
  • env 的自定义命令将向您吐出它所拥有的环境。如果没有,您只需将其设置为适当的值。终端中的echo $DISPLAY 会告诉你。

标签: qt shell ubuntu sudo


【解决方案1】:

解决方案 1:

在 Qt 中使用 sudo 运行我需要的命令,并被要求输入密码

myLib.pro

QMAKE_POST_LINK = /home/me/sudo_move_libs_script

sudo_move_libs_script:

#!/bin/bash 
ssh-askpass Sudo Password | sudo -S bash $HOME/move_libs_script

move_libs_script:

#!/bin/bash 
cp $HOME/myLib/myLib.so.1 /usr/local/lib/
ldconfig

解决方案 2

避免使用 sudo:从 Qt Creator 运行自定义可执行文件(就像我在部署项目时所做的那样) - 我可以使用正确的依赖关系执行我的程序。不幸的是,它不适用于调试。

在运行配置中,放置一个脚本“dummy_executable”而不是应用程序可执行文件:

dummy_executable:

#!/bin/sh
LD_LIBRARY_PATH=$HOME/myLib
export LD_LIBRARY_PATH
$HOME/myExec/myExec "$@

此方法非常适合运行程序...不幸的是 gdb 失败...我认为它会尝试调试 shell 脚本?因此,如果我尝试单步执行我的程序,它将无法正常工作。

选择解决方案 1,因为它具有以下优点:允许我构建和调试程序,这是我真正需要的,并且通过设置依赖项,我可以在运行程序之前构建库 - 这是完美的。

谢谢伊坦·赖斯纳

【讨论】:

  • 如果您 sudo 主脚本,您可能也不需要 sudo in 脚本。
猜你喜欢
  • 1970-01-01
  • 2022-11-10
  • 2015-02-21
  • 2014-11-18
  • 2015-11-06
  • 2021-10-26
  • 2016-10-02
  • 1970-01-01
相关资源
最近更新 更多