Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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才能运行sudo_Linux_Bash - Fatal编程技术网

Linux sudo对不起,你必须有一个tty才能运行sudo

Linux sudo对不起,你必须有一个tty才能运行sudo,linux,bash,Linux,Bash,我已经编写了一个bash脚本,它可以运行到每台机器并运行一组命令。我正在使用在该计算机上具有sudo权限的用户iis。但是,当我运行sudo-yum命令时,我得到sudo:对不起,您必须有一个tty才能运行sudo 不知道怎么了?我正在使用-t命令强制执行,但它仍然不起作用 bash脚本 #!/bin/bash INPUT=ccidetails.csv OLDIFS=$IFS IFS=, [ ! -f $INPUT ] && { echo "$INPUT file not fou

我已经编写了一个bash脚本,它可以运行到每台机器并运行一组命令。我正在使用在该计算机上具有sudo权限的用户iis。但是,当我运行sudo-yum命令时,我得到sudo:对不起,您必须有一个tty才能运行sudo

不知道怎么了?我正在使用-t命令强制执行,但它仍然不起作用

bash脚本

#!/bin/bash
INPUT=ccidetails.csv
OLDIFS=$IFS
IFS=,
[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }
while read privateip password
do
echo $privateip
scp /home/Data/Test.c iis@$privateip:/tmp
sshpass -p$password </dev/null ssh -t -o "StrictHostKeyChecking no" iis@$privateip "

hostname
cd /tmp
gcc Test.c -o TEST
./TEST
sudo yum -y update glibc
gcc Test.c -o TEST
./TEST
exit

" >> output.txt

done < $INPUT
IFS=$OLDIFS

在远程主机上,在/etc/sudoers上注释下面的行:

 grep tty /etc/sudoers
#Defaults    requiretty
这样你就可以继续了。确保您了解这样做的后果:

man sudoers | grep -i requiretty  -A 5
       requiretty      If set, sudo will only run when the user is logged in
                       to a real tty.  When this flag is set, sudo can only be
                       run from a login session and not via other means such
                       as cron(8) or cgi-bin scripts.  This flag is off by
                       default.
如果不想全局禁用Requirety,可以针对特定用户禁用它:

例如:

Defaults    requiretty
Defaults:your_username_goes_here !requiretty

在远程主机上,在/etc/sudoers上注释下面的行:

 grep tty /etc/sudoers
#Defaults    requiretty
这样你就可以继续了。确保您了解这样做的后果:

man sudoers | grep -i requiretty  -A 5
       requiretty      If set, sudo will only run when the user is logged in
                       to a real tty.  When this flag is set, sudo can only be
                       run from a login session and not via other means such
                       as cron(8) or cgi-bin scripts.  This flag is off by
                       default.
如果不想全局禁用Requirety,可以针对特定用户禁用它:

例如:

Defaults    requiretty
Defaults:your_username_goes_here !requiretty

虽然这不是一个问题,所以,你就快到了。。。你需要改变的是上面-t的数目。。。试试这个:

sshpass -p$password </dev/null ssh -ttt -o "StrictHostKeyChecking no" iis@$privateip "

sshpass-p$password虽然这不是一个问题,但你就快到了。。。你需要改变的是上面-t的数目。。。试试这个:

sshpass -p$password </dev/null ssh -ttt -o "StrictHostKeyChecking no" iis@$privateip "


“代码> SSHPASS -P $密码谢谢,但这不是我可以考虑的选项。您可以在全局范围内代替它来定义不需要登录的用户。in@user3846091I我刚刚编辑了我的答案,展示了如何禁用单个user@user3846091,如果您不控制
/etc/sudoers
的内容,你如何避免<代码> SUDO < /CUD>需要一个密码来继续?谢谢你的研究,但这不是我可以考虑的选项。你可以在全球范围内做一个不需要记录的用户。in@user3846091I我刚刚编辑了我的答案,展示了如何禁用单个user@user3846091,如果您不控制
/etc/sudoers
的内容,您如何避免
sudo
调用需要密码才能继续?谢谢,这确实帮助了meI在终端tcgetattr上只看到以下消息:设备的ioctl不合适为什么是三个
-tt
应该足以无条件地分配一个TTY。@CharlesDuffy:我过去有几次-tt不起作用,-ttt从未让我失望过。不要问我解释查看源代码:--一旦你有了两个
t
s,你能从更多中得到的唯一效果就是从
REQUEST\u TTY\u FORCE
返回到
REQUEST\u TTY\u YES
,这是你只从一个中得到的。(对我来说,这实际上看起来像一个bug,因为与文档一致的行为将是停留在
请求\u TTY\u FORCE
)。谢谢这确实帮助我在终端tcgetattr上只看到以下消息:设备的ioctl不适当为什么是三个
-tt
应该足以无条件地分配一个TTY。@CharlesDuffy:我过去有几次-tt不起作用,-ttt从未让我失望过。不要问我解释查看源代码:--一旦你有了两个
t
s,你能从更多中得到的唯一效果就是从
REQUEST\u TTY\u FORCE
返回到
REQUEST\u TTY\u YES
,这是你只从一个中得到的。(对我来说,这实际上看起来像一个bug,因为与文档一致的行为将是停留在
请求\u TTY\u FORCE
)。顺便说一句,这里有一堆bug与缺少引号有关——例如,看看如果你有一个带有空格的密码会发生什么。使用
-p“$password”
,而不是
-p$password
。类似地,引用其他扩展(例如
“iis@$privateip”
而不是
iis@$privateip
)可以防止其他错误——在这种特定情况下,例如,如果
IFS
包含
字符,或者在
$privateip
中可以找到的任何其他错误,
[-f“$INPUT”]
,而不是
[-f$INPUT]
,否则
INPUT
的空值变成
[-f]
,这相当于
[-n-f]
,这始终是真的<代码>[[-f$INPUT]]
也是安全的,因为
[[[]]
有来自bash解析器的支持(并抑制字符串拆分和全局扩展)。顺便说一句,这里有一堆与缺少引号有关的bug——例如,如果密码中有空格,会发生什么。使用
-p“$password”
,而不是
-p$password
。类似地,引用其他扩展(例如
“iis@$privateip”
而不是
iis@$privateip
)可以防止其他错误——在这种特定情况下,例如,如果
IFS
包含
字符,或者在
$privateip
中可以找到的任何其他错误,
[-f“$INPUT”]
,而不是
[-f$INPUT]
,否则
INPUT
的空值变成
[-f]
,这相当于
[-n-f]
,这始终是真的<代码>[[-f$INPUT]]也是安全的,因为
[[[]]
具有bash解析器的支持(并抑制字符串拆分和全局扩展)。