su
如何在终端中使用一行命令登录?我知道该sudo
命令可以做到这一点:
echo [password] | sudo -S [command]
但是当我尝试在su
命令中暗示它时:
echo [password] | su [username]
我收到错误:
standard in must be tty
我无权访问该sudo
帐户(因此我无法访问和编辑该sudoers
文件)。
我知道正确的语法基本上是:
su [username]
我想要做的是su
向别名添加命令,而不需要每次都输入密码
答案1
6年零2个月前提问
我怎么能够登录苏终端中的一行命令?
这是为了使用须藤每次都不会提示输入密码:
/etc/sudoers
通过 visudo
或 编辑文件sudo visudo
至少在 RHEL/CentOS 7 中,在文件底部/etc/sudoers
您将看到 COMMANDS 部分。具体来说是这样的:
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
## Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: ALL
默认情况下...对于 RHEL/CentOS,我无法代表其他 Linux 发行版如何使用它...只需注释掉第一个,#
然后使具有该语法的行生效即可NOPASSWD: ALL
。或者输入此语法。
这%wheel
意味着这些帐户车轮中定义的组/etc/group
。您可以添加一行并使其%users
允许以下位置的任何帐户用户将此无密码功能分组,如果您使用用户以这种方式分组(gid 100)。
为了我怎么能够就是你,%wheel
语法和%
手段车轮是一个团体。要指定特定的用户帐户,只需删除%
并使用用户帐户代替组名称。例如:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
如果您的用户帐户名是,只需执行此操作abc123
abc123 ALL=(ALL) NOPASSWD: ALL
最好将其放在文件的底部,以便如果所述用户帐户也是wheel组的一部分并且在该语句之上有效,则如果您放置此语句,则不会覆盖并撤消此语句用户文件顶部的声明。
不知道如何取消使用时的密码提示苏以上述方式但是
您可以做的是sudo su <username>
不提示输入密码,以及在sudo su
没有密码的情况下执行和su'ing到root帐户。
我所描述的是我所知道的关于如何获得无密码提示功能同时保持良好安全性的最佳方法......该/etc/sudoers
文件是这里的安全焦点。
的文件权限/etc/sudoers
应root
同时适用于所有者和组,-r--r-----
权限为 440。
笔记:usingabc123 ALL=(ALL) NOPASSWD: ALL
将允许该用户帐户执行 a 操作sudo su
并切换到 root 帐户,而不会提示输入 root 帐户的密码。
答案2
正确答案是:
这很危险!不要这样做 !它完全破坏了你的安全!
但是......
如果你不关心安全性,你可以这样做:
main.c
创建一个包含以下内容的文件:
#include <stdlib.h>
#include <unistd.h>
int main() {
setuid(0);
system("/bin/bash"); //you can replace bash by another shell if wanted
return 0;
}
- 编译此代码并将其转换为 suid shell:
gcc main.c -o mysuidshell
sudo chown root mysuidshell && sudo chmod u+s mysuidshell
您现在可以创建您在 LXGA 答案的评论中提到的别名:
alias switch="/path/to/mysuidshell"
。
尽管这在安全方面仍然是一个糟糕的想法,但您也有一个极其微小的优势,即您的密码在明文中不可见。
根据您想要执行的操作,您可以更改代码,以便它可以更改为除 root 之外的其他用户,运行不同的 shell,...
但你基本上会重新发明轮子(su
和sudo
),但安全性较差。
答案3
这正是 Expect 的设计目的。它最初是为 Tcl/Tk 编写的,但我不太擅长事实使用该语言,所以这里是 Python 版本:
#!/usr/bin/python3
import os,sys,pexpect
child = pexpect.spawn("sudo head /etc/shadow")
# Give it a list of expected responses (only one here)
Result = child.expect([" password for"])
# Did we find the zeroth answer in our list?
if Result==0:
# Yes, then send the password
child.sendline('<your password>')
# Output its response
print(child.read())
else:
print("Didn't get expected response")
您必须对其进行编辑以适合您的目的,希望这足以让您开始。
答案4
长话短说:
作为根,
- 在 中, 在其他行之前
/etc/pam.d/su
添加行: 。auth sufficient pam_wheel.so trust
- 执行
getent group wheel || groupadd wheel
- 执行
usermod -aG wheel joeuser
(对于名为 的用户joeuser
)
更长的解释
在Unix系统上,习惯上使用wheel
组来授予用户管理员/root权限;但是 - 默认情况下不启用权限升级功能。在现代 Linux 系统上(至少过去 15 年,可能更早),可以通过在 PAM 中添加一行来完成 配置文件下/etc/pam.d/
- 具体而言,到su
文件。该行表示:“如果用户位于wheel组中,则这足以作为身份验证”。
当然,您实际上需要放入该轮组中,因此如果该组不存在,则创建该组的说明(这通常是,因为 Linux 发行版通常不会在安装时创建它),然后进行添加。
就是这样。 Joe 用户现在su
无需提供密码即可运行。
笔记:
- 这是比 sudo 更旧的机制,并且不依赖它。
- 请参阅有关创建组的问题:如果组尚不存在,是否可以使用简短的命令来创建该组?
关于创建组的命令。