Ubuntu: Accidentally changed root user to nonexistent shell

8

I tried to change my user's shell, but used "sudo chsh", and changed the root shell to "bash" instead of "/bin/bash". Now when I try to change it I get "chsh: PAM authentication failed" and it seems like other things aren't working, either.

~$ sudo su
Cannot execute bash: No such file or directory

This happens with recovery mode, too. What do I do to change it to something usable?

endolith

Posted 2009-11-21T08:29:26.457

Reputation: 6 626

Answers

16

If you are able to login using your regular user, just change the root users shell directly:

sudo gedit /etc/passwd

Find the line for you root user, usually the first one, and change the last part from

...:bash

to

...:/bin/bash

And you should be good to go.

(NB: Replace gedit with whatever editor you fancy.)

Bjarke Freund-Hansen

Posted 2009-11-21T08:29:26.457

Reputation: 1 151

6

Use the Ubuntu install disk to boot the live session.

Mount the root ('/') partition on the harddisk (make sure it's writable).

edit '[HD mount point]/etc/passwd' (eg /media/sda1/etc/passwd),

root should be the first line, just correct the login shell which will be the last entry on the line.

Unmount harddisk. Remove CD. Reboot

JRT

Posted 2009-11-21T08:29:26.457

Reputation: 633

3This is "if you can't log in as your regular user" – Broam – 2010-05-25T13:38:04.127

2

I played with this once ages ago:

cd /bin ; sudo su

What's happening is without a / in front the shell is being interpreted as a relative path. Oh gee if we are in /bin it resolves correctly.

If you get really stuck; the rescue CD is the long way around. The boot option init=/bin/sh gives you a root shell immediately. The cursor just blinks at you with no prompt but you have a root shell. Do

set -i
# mount / -o remmount,rw
# vi /etc/passwd
<fix it>
# mount / -o remount,ro
# reboot -f

Joshua

Posted 2009-11-21T08:29:26.457

Reputation: 619

1

Note, as a short-term work-around, you can use the "-s" switch on the su command to specify a shell. For example:

su -s /bin/bash

would start your su session with the /bin/bash shell. Same goes for sudo su -s /bin/bash (or whatever shell you'd like) @Bjarke Freund-Hansen's answer is the permanent fix.

apocalysque

Posted 2009-11-21T08:29:26.457

Reputation: 583

I've just found out yesterday this doesn't work. If the current shell for the target account isn't in /etc/shells, su ignores -s unless the caller is already root. – Joshua – 2019-01-20T23:08:56.353

Did you try putting sudo in front of the su like the original question does? – apocalysque – 2019-02-13T08:41:45.373