通过脚本中的命令行更改shell(使用chsh)

在设置机器的启动脚本中,我想运行

chsh -s /bin/zsh 

但是,这要求用户的密码。 我如何传递密码作为参数? 或者如果我有sudo权力,我可以绕过那一步吗? 或者,还有另一种方法来更改默认的启动shell

以下内容可以防止locking的帐户更改其shell,并有select地让人们使用chsh自己没有sudo或su:

简单的设置仍然是安全的:

  1. 添加这个/etc/pam.d/chsh顶部:

     # This allows users of group chsh to change their shells without a password. # # Per: http://serverfault.com/questions/202468/changing-the-shell-using-chsh-via-the-command-line-in-a-script # auth sufficient pam_wheel.so trust group=chsh 
  2. 创buildchsh组:

     groupadd chsh 

对于任何允许更改shell的用户:

  usermod -a -G chsh username 

钱射击:

 user@host:~$ getent passwd $USER user:x:1000:1001::/home/user:/bin/bash user@host:~$ chsh -s `which zsh` user@host:~$ getent passwd $USER user:x:1000:1001::/home/user:/usr/bin/zsh user@host:~$ 

你需要通过用户名; 通过sudo (或root)执行此操作将允许您设置用户的密码/ shell而不需要询问旧密码。 请查看man chsh获取更多信息。

现在我的问题是:你为什么想这样做? 如果它是一个设置脚本,你不应该在创build时更改用户的shell(即启动adduser )吗? 如果你在远程克隆一个系统,你不应该先在/etc/passwd改变它吗? 除非您自动执行整个安装过程,并且在创build第一个用户之后select要安装的shell,否则我没有看到通过脚本执行此操作的理由。

chsh实际上改变了/ etc / passwd中与用户有关的行,尽pipe用户只能在/ etc / passwd中更改他/她自己的“行”。 因此,如果你想换另一个用户的shell,你需要他/她的密码。

如果你真的想这样做(考虑到洛伦佐的post中的担忧,以及可能的安全问题),可以这样做:

 #visudo 

这需要root权限。

假设你目前正在运行“alice”,并且想要改变“bob”的shell而没有密码;

添加到文件中:

 Cmnd_Alias SHELL = /usr/bin/chsh Runas_Alias SH = Bob alice ALL = (SH) NOPASSWD: SHELL 

这可以确保'alice'可以作为组SH中的用户在所有主机上运行,​​而不需要密码SHELL中的命令组。

这样做可能有点牵强,但这是可能的。

在使用'visudo'更改sudores文件之前,一定要阅读“man sudoers”,特别是与安全有关的消息!

试试sudo chsh -s /bin/zsh ,然后:

  1. 退出服务器
  2. 重启terminal
  3. login到服务器,并通过echo $SHELL检查 – 在成功的情况下它改变了:)

我相信你可以通过使用passwd命令来更改/etc/password文件中的用户shell。 我还没有通读它,但这可能是有用的: UNIX shell的差异,以及如何改变你的shell 。