报错代码
/usr/bin/sudo must be owned by uid 0 and have the setuid bit set
分析
当 /usr/bin/sudo 文件的权限设置不正确时,会出现运行 sudo 命令时报错的情况
解决方法
# chown root:root /usr/bin/sudo ; chmod 4755 /usr/bin/sudo
/usr/bin/sudo must be owned by uid 0 and have the setuid bit set
当 /usr/bin/sudo 文件的权限设置不正确时,会出现运行 sudo 命令时报错的情况
# chown root:root /usr/bin/sudo ; chmod 4755 /usr/bin/sudo
#!/bin/bash
while ((1));
do
sleep 1
echo "infinite loop"
done
或者:
#!/bin/bash
while :
do
sleep 1
echo "infinite loop"
done
#!/bin/bash
i=1;n=5
while ((i <= n))
do
echo $i
let i++
done
或者:
#!/bin/bash
i=1;n=5
while [[ $i -le $n ]]
do
echo $i
let i++
done
#!/bin/bash
i=1
while ((i <= 5));
do
let sum=$sum+$i
let i++
done
echo $sum
或者:
#!/bin/bash
i=1
while [[ $i -le 5 ]];
do
let sum=$sum+$i
let i++
done
echo $sum
#!/bin/bash
sum=0
echo 'Please input number, you must press 'enter' after inputting each number, press 'ctrl' and 'd' at the same time to end the input"
while read num
do
let sum=$sum+$num
done
echo $sum
#!/bin/bash
while read line
do
echo $line
done < test.txt
或者:
#!/bin/bash
cat test.txt | {
while read line
do
echo $line
done }
或者:
#!/bin/bash
cat test.txt | while read line
do
echo $line
done
(补充:这里以阅读 test.txt 文件为例)
# vi test.txt
创建以下内容:
no1 user1 test1.txt
no2 user2 test2.txt
no3 user3 test3.txt
no4 user4 test4.txt
no5 uesr5 test5.txt
# cat test.txt | while read no user file ;do echo $no $file;done
no1 test1.txt
no2 test2.txt
no3 test3.txt
no4 test4.txt
no5 test5.txt
根据问题发生的时间线,回溯最近发生了哪些情况和做了哪些变更,通过回溯找到发生问题的原因
根据事件的重要性和特点找到其核心点,并根据核心点分析产生问题的核心
对发生的问题进行定义,对问题的特征进行描述,通过定义和特征逐一排查,找到可能导致问题的原因
大家一起什么都想,快速获得任何和问题相关的信息,但是得到信息往往不够客观
将发生的问题看成一个主线,分析每一条汇入这条主线的分线,这些分线都有可能导致最后出现在主线上的问题,最终找到导致主线问题的原因在哪条分线上
分析哪些问题影响最大,先解决所有问题中最重要的那 20%,因为往往解决最重要的 20% 问题可能就会达到 80% 的效果
5 个为什么只是一个抽象的概念,真实情况是对发生问题的原因一只追问下去,先问导致问题的原因是什么,根据这个原因再问导致这个原因的原因是什么,直到问到根本原因以后才停止,此方法由日本丰田公司大野耐一发明。使用此方法需要注意:
1) 避免使用借口回答问题
2) 避免在追问的过程中牵扯到人的心理
3) 避免回答问题时推卸责任
4) 避免各个问题之间没有层级关系
# cp /etc/ssh/sshd_config /etc/ssh/sshdsftp_config
# cp /usr/lib/systemd/system/sshd.service /etc/systemd/system/sshdsftp.service
# vim /etc/systemd/system/sshdsftp.service
将以下内容:
......
Description=OpenSSH server daemon
......
ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY
......
修改为:
......
Description=OpenSSH SFTP server daemon
......
ExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshdsftp_config $OPTIONS $CRYPTO_POLICY
......
# systemctl daemon-reload
# vim /etc/ssh/sshdsftp_config
将以下内容:
......
#Port 22
......
修改为:
......
Port 2222
......
# vim /etc/ssh/sshd_config
如果是 CentOS Linux & RHEL,将以下内容:
......
Subsystem sftp /usr/libexec/openssh/sftp-server
......
修改为:
......
#Subsystem sftp /usr/libexec/openssh/sftp-server
......
如果是 openSUSE & SLES, 将以下内容:
......
Subsystem sftp /usr/lib/ssh/sftp-server
......
修改为:
......
# Subsystem sftp /usr/lib/ssh/sftp-server
......
# firewall-cmd --add-port=2222/tcp --perm
(补充:这里以在 firewalld 防火墙开通 2222 端口为例)
# firewall-cmd --reload
# semanage port -a -t ssh_port_t -p tcp 2222
(补充:这里以给 2222 端口打上 SSH 的标签为例)
(注意:此步骤只有在 SELinux 开启,且处于 enforcing 状态时才需要设置)
# systemctl enable --now sshdsftp
# systemctl restart sshd
# vim /etc/ssh/sshdsftp_config
如果是 CentOS Linux & RHEL,将以下内容:
......
Subsystem sftp /usr/libexec/openssh/sftp-server
......
修改为:
......
#Subsystem sftp /usr/libexec/openssh/sftp-server
......
如果是 openSUSE & SLES, 将以下内容:
......
Subsystem sftp /usr/lib/ssh/sftp-server
......
修改为:
......
# Subsystem sftp /usr/lib/ssh/sftp-server
......
并添加以下内容:
......
Subsystem sftp internal-sftp
Match LocalPort 2222
ChrootDirectory /%u
ForceCommand internal-sftp -m 770
AllowTcpForwarding no
X11Forwarding no
(
补充:
1) 这里以将:
SFTP 的端口设置为 2222
SFTP 用户可以进入的目录只能为 /<user>
SFTP 上传的文件默认权限是 770 (-m 770 参数也可以使用 -u 770 替代,但是 -u 参数有时候会不起作用)
为例
2) 其它配置方案可以参考
)
# systemctl restart sshdsftp
# useradd sftpuser
(补充:这里以创建名为 sftpuser 的用户为例)
# usermod -s /bin/false sftpuser
(补充:这里以将用户 sftpuser 的解释器修改成 /bin/false 为例)
或者:
# usermod -s /sbin/nologin sftpuser
(补充:这里以将用户 sftpuser 的解释器修改成 /sbin/nologin 为例)
# passwd sftpuser
(补充:这里以给 sftpuser 用户设置密码为例)
# mkdir /sftpuser
(补充:因为在本文步骤 2.1 中,设置的 SFTP 用户的目录是 /<user>,且在本文步骤 3.1 中创建的用户名是 sftpuser,所以这里的 SFTP 目录是 /sftpuser)
# chown root: /sftpuser
(注意:SFTP 目录以及所有 SFTP 目录的父目录的所属主必须是 root,权限最高只能是 755 或者 750,否则就算此目录的所属主是此 SFTP 用户,此用户在登录时也会报错)
# chmod 755 /sftpuser
(注意:SFTP 目录以及所有 SFTP 目录的父目录的所属主必须是 root,权限最高只能是 755 或者 750,否则就算此目录的所属主是此 SFTP 用户,此用户在登录时也会报错)
# useradd nosftp
(补充:这里以创建测试用户 nosftp 为例)
# passwd nosftp
# ssh sftpuser@127.0.0.1
(补充:这里以测试用户是 sftp 为例)
# sftp -P 2222 sftpuser@127.0.0.1
Connected to sftpuser@127.0.0.1.
sftp>
(补充:这里以 SFTP 端口是 2222,SFTP 目录时 /sftpuser ,测试用户是 sftpuser 为例)
sftp> cd /
sftp> ls
write
sftp>
(补充:此时发现目前 SFTP 的根 “/” 并不是 Linux 系统的根 “/” 目录)
# ssh nosftp@127.0.0.1
(补充:这里以 SSH 端口是 22,测试用户是 nosftp 为例)
# ssh -p 2222 sftpuser@127.0.0.1
sftpuser@192.168.8.58's password:
This service allows sftp connections only.
Connection to 10.0.0.3 closed.
#
(补充:这里以 SFTP 端口是 2222,SFTP 目录是 /sftpuser,测试用户是 sftpuser 为例)
# ssh -p 2222 nosftp@127.0.0.1
client_loop: send disconnect: Broken pipe
#
(补充:这里以 SFTP 端口是 2222,SFTP 目录是 /sftp,测试用户是 nosftp 为例)
# sftp sftpuser@127.0.0.1
subsystem request failed on channel 0
Connection closed
#
或者:
# sftp sftpuser@127.0.0.1
sftpuser@127.0.0.1's password:
Received message too long 1416133333
Ensure the remote shell produces no output for non-interactive sessions.
#
(补充:这里以 SFTP 端口是 22,测试用户是 sftpuser 为例)
# sftp -P 2222 nosftp@127.0.0.1
client_loop: send disconnect: Broken pipe
Connection closed
#
(补充:这里以 SFTP 端口是 2222,SFTP 目录是 /sftp,测试用户是 nosftp 为例)
# sftp -P 2222 sftpuser@127.0.0.1
Connected to sftpuser@127.0.0.1.
sftp>
(补充:这里以 SFTP 端口是 2222,SFTP 目录是 /sftpuser ,测试用户是 sftpuser 为例)
$ sftp -P 2222 sftpuser@127.0.0.1
sftpuser@127.0.0.1's password:
Permission denied, please try again.
sftpuser@127.0.0.1's password:
Permission denied, please try again.
sftpuser@127.0.0.1's password:
sftpuser@127.0.0.1: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
Connection closed
(补充:这里以测试用户 sftpuser 为例)
# sftp -P 2222 sftpuser@127.0.0.1
sftpuser@127.0.0.1 password:
Connection closed.
Connection closed
(补充:这里以测试用户 sftpuser 为例)
修改 /usr/lib/systemd/system/emergency.service 文件
# vim /usr/lib/systemd/system/emergency.service
添加以下内容:
......
ExecStart=-/usr/lib/systemd/systemd-sulogin-shell emergency
(补充:此时进入单用户模式需要输入 root 密码以后才能进入)
显示 /usr/lib/systemd/system/emergency.service 文件里的 /systemd-sulogin-shell 参数
# grep /systemd-sulogin-shell /usr/lib/systemd/system/emergency.service
ExecStart=-/usr/lib/systemd/systemd-sulogin-shell emergency
(补充:此时进入单用户模式需要输入 root 密码以后才能进入)