Choosing the shell that SSH uses?
Solution 1:
Assuming you're running on Linux, you can use the chsh
command.
chsh -s /bin/ksh foo
chsh -s /bin/bash username
Solution 2:
man chsh
changes shell, does not always work
Alternatively, you can stick exec /bin/zsh
in your bash login script.this will replace bash instance with your shell.
Or you can do ssh host "zsh -l"
Solution 3:
Edit /etc/passwd (if you have the rights, or ask your system admin) to change your default shell.
Solution 4:
If you can't change your default shell, ssh -t user@host 'zsh -l'
works.
The -t
flag forces a pseudo-tty allocation, and the -l
flag spawns a login shell.
Solution 5:
I'm not sure how you can put your local .zshrc
to remote server, (that's without permanently storing it there), this works for me to change my login shell on remote server.
Since it's a shared account, I can use zsh
only for myself with this method.
Add this to your ~/.ssh/config
file in your local machine.
Host yourServer
HostName <IP, FQDN or DNS resolvable name>
IdentityFile ~/.ssh/<your keyfile>
RemoteCommand zsh -l
RequestTTY force
User <yourUsername>
There could be hackish way to accomplish what you are looking for, like below.
WARNING This comes with no guarantees and doesn't look 'wise', however I did managed to put my local file to server and source it in login shell using this.
Host someHost
HostName someIP
IdentityFile ~/.ssh/somekey.pem
RemoteCommand zsh -l -c 'sleep 1; source /tmp/somefile; zsh'
PermitLocalCommand yes
LocalCommand bash -c 'sftp %r@%h <<< "put /tmp/somefile /tmp/somefile"'
RequestTTY force
User someUser
How it works?
RemoteCommand
defines what needs to be run on remote side.LocalCommand
defines what needs to be run on local, which is used to copy your local file to remote server for sourcing it. Here is the catch, it happens only after 'successful' connection to remote host.
Meaning:
- Your connection to remote should be open and alive
- Your remote shell doesn't have the file yet, so it has to wait till file is there, ergo
sleep
- Your local uses
sftp
to put your file to remote server, remote server wakes up fromsleep
and sources your scripts.
It's super hackish, I'd like to know if there is a better way, too.
Update:
This can be used instead of 'long' sleep time:
RemoteCommand zsh -l -c 'while [[ ! -f /tmp/somefile ]]; do sleep 0.05; done; source /tmp/somefile; zsh'