我有 ubuntu 8.04,我想编写一个 bash 脚本,root每个用户都可以运行该脚本。
我自己可以做 sudo。
我怎么做?
澄清:我不想用 sudo 来做,因为那样用户将不得不输入他们的密码。我只是想让他们以 root 身份运行脚本,也许是 setuid,不知道。
问题描述:
我在/etc/sudoers文件中输入了一个错字,从而破坏了它。现在我不能再使用任何 sudo 命令,因为下面的错误被抛出。因此我无法修复我的 sudoers 文件并且被有效地卡住了。
$ sudo nano /etc/sudoers
>>> /etc/sudoers: syntax error near line 39 <<<
sudo: parse error in /etc/sudoers near line 39
sudo: no valid sudoers sources found, quitting
Run Code Online (Sandbox Code Playgroud)
我发现很少有解决方案说我应该启动到恢复模式(如下所示),我显然想避免这种情况。
Ubuntu :我的 sudoers 文件出错了,我该如何修复?
问题:
- 有没有其他方法可以在不重新启动 ubuntu 的情况下修复它?
- 如果在修改 sudoers 文件时很容易将自己锁定在 sudo 之外(每个人都会打错字),为什么不直接从内存中读取 sudoers 配置而不是从文件中读取?将有一个命令(例如 sudo-load)在将配置加载到内存之前确保语法正确,从而避免此类问题。
解决方案:
似乎有两种方法可以恢复它:
- 如果您有 root 密码,您可以简单地发出“su”,然后编辑文件
- 如果您没有 root 密码,您需要重新启动到单用户模式
所以我正在测试一个小型的 CentOS 构建(机架空间云)。我设置了我的用户并去做了一些 sudo'ing。好吧,我忘记了使用 visudo 将我的用户添加到 sudoers 文件的步骤。所以当然,我收到了这个错误:
不在 sudoers 文件中。此事件将被报告。
以前没见过,所以现在想知道。这是从哪里报告的?它只是发送到邮件,还是记录在某个地方?
谢谢你的帮助
我正在尝试在此处的文档中像这样通过 SSH 运行命令:
ssh example.com <<END
sudo /etc/init.d/apache2 reload
END
Run Code Online (Sandbox Code Playgroud)
这通常有效,除非我尝试运行需要输入的内容,例如 sudo 的密码。在这种情况下,我收到以下消息:
sudo: no tty present and no askpass program specified
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用-tSSH 上的标志来分配一个伪 tty,例如:
ssh -t example.com "sudo /etc/init.d/apache2 reload"
Run Code Online (Sandbox Code Playgroud)
它会起作用,但是当我用 here-document 尝试同样的事情时,它不起作用,我会得到关于没有 tty 的相同错误:
ssh -t example.com <<END
sudo /etc/init.d/apache2 reload
END
Run Code Online (Sandbox Code Playgroud)
知道我怎样才能使这项工作?
另外,如果您想知道为什么我希望它与 here-document 一起使用而不是仅仅在同一行上传递它,那是因为输入命令(可能有几个)来自脚本读取的配置文件我听说它避免了转义引号、双引号等命令的麻烦。
我创建了一个符号链接:
ln -s /tmp/folder1 /tmp/folder2
然后我去 /tmp/folder2 并运行pwd:
$ cd /tmp/folder2/
$ pwd
/tmp/folder2
$ sudo pwd
/tmp/folder1 # <-- This is the odd part
Run Code Online (Sandbox Code Playgroud)
为什么pwdwithsudo给了原目录?我正在编写一个 bash 脚本,需要当前目录的绝对路径。使用 sudo 我似乎无法获得原始目录。
在 Linux 服务器上,我需要从一组用户中删除 root 权限。但是这些用户有正当理由能够使用“查找”实用程序根据文件名、修改日期和其他元数据搜索文件。
在服务器上,文件名不敏感,但文件内容可能敏感。
我想使用 sudo 来允许用户搜索服务器上任何地方的文件。“find”实用程序很棒,但它会产生各种副作用,例如使用“-exec”生成任意命令。
我可以find在我的限制下工作吗?
哪种方法更好?
对于桌面使用,似乎 sudo 更好,因为:
但是在服务器管理方面呢?
在服务器中,您通常已经创建了一个 root 帐户,并且您可能经常进行管理工作。所以 sudo 的优势似乎不再成立。
更重要的是,在大多数发行版中,在命令行上配置 su 很容易,只需将用户添加到轮组中即可。(你甚至可以-G wheel在useradding时通过。)因此配置 su 可以很容易地自动化到 shell 脚本中。
但是对于sudo?您需要先添加用户,然后以visudo交互方式运行。这很糟糕,因为您无法将其自动化为 shell 脚本。
(嗯,你可以。例如,
echo '%wheel ALL=(ALL) ALL' >> /tmp/sudoers.tmp
cp /etc/sudoers /etc/sudoers.old
visudo -c -f /tmp/sudoers.tmp && mv /tmp/sudoers.tmp /etc/sudoers
Run Code Online (Sandbox Code Playgroud)
但至少没有那么容易。)
那么你有什么看法呢?对于服务器环境,您更喜欢 sudo 还是 su root?
在 sudoers 文件中,如何在同一行上使用多个 Tag_Specs。
通常,如果我不想要求输入密码,我会这样做:
who where = (aswhom) NOPASSWD: commands
Run Code Online (Sandbox Code Playgroud)
我想使用SETENV标签以便用户可以保留环境变量。这可以正常工作:
who where = (aswhom) SETENV: commands
Run Code Online (Sandbox Code Playgroud)
从 sudoers(5) 手册页:
Tag_Spec ::= ('NOPASSWD:' | 'PASSWD:' | 'NOEXEC:' | 'EXEC:' |
'SETENV:' | 'NOSETENV:' | 'LOG_INPUT:' | 'NOLOG_INPUT:' |
'LOG_OUTPUT:' | 'NOLOG_OUTPUT:')
Run Code Online (Sandbox Code Playgroud)
我看不到如何在同一个条目上使用多个标签。我想在同一条线上使用NOPASSWD和SETENV。
使用最新的、稳定的 Ansible 版本,我有一个奇怪的问题,我的剧本在“Gathering_Facts”期间挂在一台服务器上,但在使用 Sudo 时在其他类似服务器上运行良好。在 Ansible 服务器上,我以我的用户(NIS 用户)身份运行,并在远程服务器上使用sudo(以 root 身份)进行更改。如果我从此设置中删除 Sudo,一切正常。
须藤版本 1.8.6p3 Sudoers 策略插件版本 1.8.6p3 sudoers 文件语法版本 42 Sudoers I/O 插件版本 1.8.6p3
-------- User1@Server1: sudo -H -S -p(挂在 Gathering_Facts 上)
/
用户 1@Ansible ----
\
-------- User1@Server2:sudo -H -S -p(工作正常)
我的 …
当您运行时,sudo在您上次运行后至少 5 分钟内不会询问密码。您可以通过添加 to 来更改此Defaults timestamp_timeout=0超时。这也立即锁定了它。sudoerssudo visudo
我的问题是是否有一种方法可以只执行一次,并且无需visudo.