Linux sudo对不起,你必须有一个tty才能运行sudo
我已经编写了一个bash脚本,它可以运行到每台机器并运行一组命令。我正在使用在该计算机上具有sudo权限的用户iis。但是,当我运行sudo-yum命令时,我得到sudo:对不起,您必须有一个tty才能运行sudo 不知道怎么了?我正在使用-t命令强制执行,但它仍然不起作用 bash脚本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
#!/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解析器的支持(并抑制字符串拆分和全局扩展)。