In a startup script that sets up a machine, I want to run

chsh -s /bin/zsh

However, this asks for the user's password. How do I pass in the password as a parameter? Or if I have sudo power, can I somehow bypass that step? Or alternatively, is there another way to change the default startup shell?

Thanks

link|improve this question
feedback

migrated from stackoverflow.com Nov 16 '10 at 14:29

This question came from our site for professional and enthusiast programmers.

4 Answers

You need to pass the username; doing this via sudo (or by root) will allow you to set a user's password/shell without being asked the old password. Please check man chsh for further information.

Now my question is: why would you want to do that? If it's a set-up script, shouldn't you just change the users' shell at creation time (i.e. when launching adduser)? If you're cloning a system remotely, shouldn't you change it in /etc/passwd first? I see no reasons for doing it via a script, unless you automated the whole installation process and the selection of shells to be installed comes after the creation of the first user.

link|improve this answer
It's for an ec2 machine (the script I run right after the machine starts up). I want to change the default starting shell. Doing "sudo chsh -s /bin/zsh user_name" doesn't work either (still asks for the user's password) – George41 Nov 15 '10 at 4:06
try using a script, and use #!/usr/bin/sudo -s (shebang line). Also, you sure zsh is in /bin and not, perhaps, in /usr/bin? (just checking, I'm not familiar with ec2) – lorenzog Nov 15 '10 at 9:26
feedback

chsh actually changes the line pertaining to a user in /etc/passwd, though a user can only change his/her own 'line' in /etc/passwd. Hence, if you want to change shell for another user, you need his / her passwd.

If you really want to do it (given the concerns in Lorenzo's post, and possible security concerns) here's how one can do this:

#visudo

This requires root privileges.

Say you're currently running as "alice" and want to change "bob's" shell without password;

Add to the file:

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

This makes sure 'alice' can run on all hosts as the users in the group SH without a password the group of commands in SHELL.

Probably a bit far fetched to do it this way, but it is possible.

Be sure to read "man sudoers" before changing the sudores file with 'visudo', especially the messages related to security!

link|improve this answer
feedback

I believe you can change the user's shell in the /etc/password file, possibly by using the passwd command. I haven't read through it yet but this may be useful: UNIX shell differences and how to change your shell.

link|improve this answer
feedback

The problem with changing the default user shell in a pre-setup system is that you may lose important variable definitions (like, say, PATH) or even other initialisation stuff. The system administrator may not have configured all shells properly or at all. Have you considered modifying the profile files for your current shell? For example in bash you could append to ~/.bash_profile the following line:

exec /bin/zsh

which would effectively switch to ZSH immediately after logging on. Take care to append an empty line beforehand, just in case there is no newline at the end of the original file. This might do it for you:

$ echo >> ~/.bash_profile

$ echo 'exec /bin/zsh' >> ~/.bash_profile

Note that this is for interactive login sessions. You might need to change ~/.bashrc for non-login interactive sessions, such as those launched in some terminal emulators. Keep in mind that ~/.bashrc is sourced by ~/.bash_profile by default in many systems.

link|improve this answer
feedback

Your Answer

 
or
required, but never shown