SSH:如何用一个命令更改配置文件中的值

SSH:如何用一个命令更改配置文件中的值

我怎样才能改变命令中PasswordAuthentication的值?/etc/ssh/sshd_config

另外,删除我希望赋值的“键”前面的 #。这些不必全部放在一个命令中。我设置了不少服务器,记住所有东西的位置很累,所以我想获得一系列我可以复制粘贴的命令,它会帮我完成工作以供将来参考。

示例值:

PermitRootLogin no
ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM no
UseDNS no

答案1

正则表达式和 sed 可以帮助解决这类事情。

sed -re 's/^(PasswordAuthentication)([[:space:]]+)no/\1\2yes/' -i.`date -I` /etc/ssh/sshd_config

在我的 Debian 系统上,这将切换PasswordAuthentication noPasswordAuthentication yes,无论键和值之间的空格数是多少。

它将在创建原始文件的备份的同时替换文件中的选项(就地编辑),并以日期命名后缀(sshd_config.2014-05-28)。

交换“是”和“否”的位置即可切换其他方式。

删除前导的表达式#如下:

 sed -re 's/^(\#)(PasswordAuthentication)([[:space:]]+)(.*)/\2\3\4/' 

- 并插入前导#- 符号:

 sed -re 's/^(PasswordAuthentication)([[:space:]]+)(.*)/#\1\2\3/' 

要切换一行,请#在前面加上可选的 - 号(感谢 Barlop):

sed -re 's/^(\#?)(PasswordAuthentication)([[:space:]]+)no/\2\3yes/' 

在所有这些表达式中,您可以更改PasswordAuthentication为您想要更改的任何其他选项 - 甚至可能将其作为 shell 脚本中的键,并制作“sshd 选项切换工具”。

Sed 和 regex 都是好玩的游戏,但我相信 Valentin 的说法是正确的,如果你有很多系统,配置管理才是王道。我个人只在几个很少改变的系统上使用 etckeeper/bazaar - 它不是配置管理,但它为我提供了版本控制,因此在我搞砸了 regex 和 之后,我可以找回一个有效的配置sed -i。:)

答案2

有多种选项可供选择:

  • Puppet、Cfengine、Chef 或任何其他配置管理工具
  • Augeas(augtool -> 打印 /files/etc/ssh/sshd_config -> 然后使用“set”)
  • sed-i
  • 还有很多

在尝试猜测您想要去的地方之后,您可能还是想考虑使用配置管理。

答案3

奥杰阿斯使用其命令行工具 -奥格工具- 可以配置/etc/ssh/sshd_config。 例如:

augtool --autosave 'set /files/etc/ssh/sshd_config/PasswordAuthentication yes'

要设置所有值,请使用:

SSHD_UsePAM=no
SSHD_UseDNS=no
augtool << EOF
set /files/etc/ssh/sshd_config/PermitRootLogin no
set /files/etc/ssh/sshd_config/ChallengeResponseAuthentication no
set /files/etc/ssh/sshd_config/PasswordAuthentication no
set /files/etc/ssh/sshd_config/UsePAM ${SSHD_UsePAM}
set /files/etc/ssh/sshd_config/UseDNS ${SSHD_UseDNS}
save
EOF

答案4

sshd_configMatch由于它可能包含块,因此无法在未完全解析的情况下进行安全编辑。

Augeas 是实现此目的的不错选择,但当已有块时,管理在正确位置插入选项并不容易Match。一种选择是使用 Puppet 和sshd_config总部位于 Augeas 的提供商

sshd_config { "PermitRootLogin":
  ensure => present,
  value  => "yes",
}

Sshd.lns该选项为您提供了使用严格解析器(带镜头的 Augeas)和抽象级别(Puppet 资源)的优势,它可以管理在Match块外部以及块内部设置参数的复杂性:

sshd_config { "X11Forwarding":
  ensure    => present,
  condition => "Host foo User root",
  value     => "yes",
}

相关内容