Memilih shell yang digunakan SSH?

31

Bagaimana cara mengatur shell yang digunakan saat pengguna SSH ke server. Misalnya saya tidak tahan BASH dan perlu menggunakan ZSH, bagaimana saya membuatnya jadi ZSH dimuat bersama dengan profil saya ( .zsh_profile) ketika saya ssh ke mesin.

Saya tidak ingin harus melewati banyak parameter dengan ssh, tidak bisakah saya mengatur shell default?

JP Silvashy
sumber

Jawaban:

34

Dengan asumsi Anda menjalankan di Linux, Anda dapat menggunakan chshperintah.

chsh -s /bin/ksh foo
chsh -s /bin/bash username
Dominic Barnes
sumber
4
Harap dicatat bahwa path ke binary harus ada /etc/shellsagar shell dapat dipilih.
Kimvais
Ubuntu 16.04 tidak memiliki perintah ini.
david.perez
@ david.perez Ya itu, di dalam passwdpaket .
hidangan penutup
Ini tidak berfungsi ketika otentikasi ditangani melalui LDAP
Daniel Kats
10

man chsh perubahan shell, tidak selalu berhasil

Atau, Anda bisa tetap exec /bin/zshmenggunakan skrip login bash Anda. Ini akan menggantikan instance bash dengan shell Anda.

Atau Anda bisa melakukannya ssh host "zsh -l"


sumber
Kenapa -1 (15 karakter ...)?
Noufal Ibrahim
itu huruf kecilL
driftcatcher
1
ssh -tdiperlukan untuk mendapatkan TTY untuk opsi terakhir. Secara default jika perintah (seperti zsh -l) disediakan, OpenSSH akan melakukan shell non-login, yang tidak akan mengalokasikan TTY untuk Anda, dan -ltidak akan mengubahnya (karena itu dijalankan setelah login).
Franklin Yu
8

Edit / etc / passwd (jika Anda memiliki hak, atau minta admin sistem Anda) untuk mengubah shell default Anda.

Valentin Rocher
sumber
Untuk beberapa alasan, pengguna yang baru saya buat tidak memiliki shell default. Ini berhasil untuk saya. Terima kasih.
mimoralea
2
Terima kasih jawaban ini bagus. Saya juga tidak punya shell di sini. Saya menemukan baris myusername: x: 1000: 1000 :: / home / myusername: dan menambahkan / bin / bash sampai akhir. Logout dan masuk dan sesi ssh saya menggunakan bash :)
Stewart Evans
6

Jika Anda tidak dapat mengubah shell default Anda, ssh -t user@host 'zsh -l'berfungsi.

The -tbendera memaksa alokasi pseudo-tty, dan -lmenumbuhkan bendera shell login .

Menandai
sumber
4

Saya tidak yakin bagaimana Anda dapat menempatkan lokal Anda .zshrcke server jauh, (itu tanpa menyimpannya secara permanen di sana), ini berfungsi bagi saya untuk mengubah shell login saya di server jauh.

Karena ini adalah akun bersama, saya zshhanya dapat menggunakan untuk diri saya sendiri dengan metode ini.

Tambahkan ini ke ~/.ssh/configfile Anda di mesin lokal Anda.

Host yourServer
    HostName <IP, FQDN or DNS resolvable name>
    IdentityFile ~/.ssh/<your keyfile>
    RemoteCommand zsh -l
    RequestTTY force
    User <yourUsername>

Mungkin ada cara hack untuk mencapai apa yang Anda cari, seperti di bawah ini.

PERINGATAN Ini datang tanpa jaminan dan tidak terlihat 'bijaksana', namun saya berhasil meletakkan file lokal saya ke server dan sumbernya di shell login menggunakan ini.

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

Bagaimana itu bekerja?

  • RemoteCommand mendefinisikan apa yang perlu dijalankan di sisi jarak jauh.
  • LocalCommandmendefinisikan apa yang perlu dijalankan di lokal, yang digunakan untuk menyalin file lokal Anda ke server jauh untuk sumbernya. Ini dia, hanya terjadi setelah koneksi 'berhasil' ke host jarak jauh.

Berarti:

  1. Koneksi Anda ke jarak jauh harus terbuka dan hidup
  2. Shell jarak jauh Anda belum memiliki file, jadi harus menunggu sampai file ada di sana, ergo sleep
  3. Penggunaan lokal Anda sftpuntuk meletakkan file Anda ke server jauh, server jauh bangun dari sleepdan sumber skrip Anda.

Ini super hackish, saya ingin tahu apakah ada cara yang lebih baik juga.

Pembaruan: Ini dapat digunakan sebagai ganti waktu tidur 'lama':
RemoteCommand zsh -l -c 'while [[ ! -f /tmp/somefile ]]; do sleep 0.05; done; source /tmp/somefile; zsh'

sdkks
sumber