通过在脚本中修改/ etc / ssh / sshd_conf来禁用ssh根登录?

Car*_*enP 1 ssh bash shell

又是我。

非常感谢,您所有的绝妙技巧都非常有用!也许您可能想把我的屁股踢过去。

在设置Raspberry的过程中,我想防止通过ssh进行root登录。与往常一样,它是一个“小脚本”(由跑步者调用)。

我的研究告诉我,即使在systemd时代,/ etc / ssh / sshd_config也是要修改的文件。到目前为止,一切都很好。以我的拙劣理解,需要做的是:逐行读取配置文件,匹配“ PermitRootLogin yes”(空格匹配);如果不匹配,则将该行写入另一个文件,如果是,则将其替换为“ PermitRootLogin no”,然后写入另一个文件,最后用新文件替换原始配置文件,然后通过systemd东西重新启动sshd。

在Perl中,我将读取整个文件,替换()行,然后将内容写回到另一个文件中。但是正如年轻的佛教徒所说:“没有Perl!”

请仅Bash(2)。

并且,一如既往,在此先感谢您!

卡斯滕

Nic*_*sai 6

脚本:

$ sed -i 's/PermitRootLogin yes/PermitRootLogin no/g' /etc/ssh/sshd_config
Run Code Online (Sandbox Code Playgroud)

然后:

$ service ssh reload
Run Code Online (Sandbox Code Playgroud)


The*_*ool 6

以编程方式配置 SSH

我对此做了一些调查,我认为 JNevevill 的答案是最可靠的。我有一些示例脚本说明了这两种方法,SED并且AWK.

准备

为了提高示例的可读性,仅显示一次测试数据。每种方法都以相同的方式对其进行初始化。它将在测试文件中定义一些规则以及应替换文件中的规则或写入文件的新规则字典。

echo 'LoginGraceTime 120' > ./data.txt
echo '#PermitRootLogin yes' >> ./data.txt
echo 'PermitRootLogin no' >> ./data.txt
echo 'PasswordAuthentication yes' >> ./data.txt

declare -A rules=( 
    ["LoginGraceTime"]="1m"
    ["PermitRootLogin"]="no"
    ["PasswordAuthentication"]="no"
    ["AllowUsers"]="blue"
)
Run Code Online (Sandbox Code Playgroud)

SED

SED将替换它找到的规则。如果某行被注释,它将删除# 并替换该值。这种方法不太可靠,因为它可能导致重复的规则。IE 存在注释和未注释的规则。另外,如果规则不存在,则根本不会被写入。

echo 'LoginGraceTime 120' > ./data.txt
echo '#PermitRootLogin yes' >> ./data.txt
echo 'PermitRootLogin no' >> ./data.txt
echo 'PasswordAuthentication yes' >> ./data.txt

declare -A rules=( 
    ["LoginGraceTime"]="1m"
    ["PermitRootLogin"]="no"
    ["PasswordAuthentication"]="no"
    ["AllowUsers"]="blue"
)
Run Code Online (Sandbox Code Playgroud)

结果:

LoginGraceTime  1m
PermitRootLogin  no
PermitRootLogin  no
PasswordAuthentication  no
Run Code Online (Sandbox Code Playgroud)

AWK

AWK在这种情况下更加稳固。它产生更好的控制。它将逐行读取并替换该值(如果存在),而不更改注释规则。如果在文件末尾未找到规则,则会将此规则附加到文件中。这比方法要可靠得多SED。我们可以确定不会有重复的规则,并且所有规则都已定义。

for rule in "${!rules[@]}"; do
  regex="s/#\?\(${rule}\s*\).*$/\1 ${rules[${rule}]}/"
  sed "${regex}" ./data.txt > temp.txt;
  mv -f temp.txt ./data.txt
done
Run Code Online (Sandbox Code Playgroud)

结果:

LoginGraceTime 1m
#PermitRootLogin yes
PermitRootLogin no
PasswordAuthentication no
AllowUsers blue
Run Code Online (Sandbox Code Playgroud)

结论

AWK 显然是更好的选择。它更安全,可以处理文件中没有的规则。


fro*_*tdl 5

你可以做这样的事情

#!/bin/bash
if [[ "${UID}" -ne 0 ]]; then
    echo " You need to run this script as root"
    exit 1
fi

#To directly modify sshd_config.

sed -i 's/#\?\(Port\s*\).*$/\1 2231/' /etc/ssh/sshd_config
sed -i 's/#\?\(PerminRootLogin\s*\).*$/\1 no/' /etc/ssh/sshd_config
sed -i 's/#\?\(PubkeyAuthentication\s*\).*$/\1 yes/' /etc/ssh/sshd_config
sed -i 's/#\?\(PermitEmptyPasswords\s*\).*$/\1 no/' /etc/ssh/sshd_config
sed -i 's/#\?\(PasswordAuthentication\s*\).*$/\1 no/' /etc/ssh/sshd_config

#Check the exit status of the last command

if [[ "${?}" -ne 0 ]]; then
   echo "The sshd_config file was not modified successfully"
   exit 1
fi
/etc/init.d/ssh restart

exit 0
Run Code Online (Sandbox Code Playgroud)


JNe*_*ill 2

你可以用awk这个:

awk '$1=="PermitRootLogin"{foundLine=1; print "PermitRootLogin no"} $1!="PermitRootLogin"{print $0} END{if(foundLine!=1) print "PermitRootLogin no"}' sshd_config > sshd_config.tmp && mv sshd_config.tmp sshd_config
Run Code Online (Sandbox Code Playgroud)

这将遍历文件中的每一行,如果第一个元素(由 awk 的默认定界符分隔)是“PermitRootLogin”,则将其更改为“no”并捕获您找到它的信息。如果该行不包含“PermitRootLogin”,则只需按原样写出即可。如果在处理所有行后没有找到“PermitRootLogin”( END),则写入该行。

#Remove 因为必须编辑 6 个字符....