Bagaimana saya bisa secara otomatis mengubah direktori pada login ssh?


87

Saya mencoba sshmengubah secara otomatis ke direktori tertentu ketika saya masuk. Saya mencoba agar perilaku itu bekerja menggunakan arahan berikut di ~/.ssh/config:

Host example.net
LocalCommand "cd web"

tetapi setiap kali saya masuk, saya melihat yang berikut:

/bin/bash: cd web: No such file or directory

meskipun meskipun pasti ada webfolder di direktori home saya. Bahkan menggunakan jalur absolut pun memberikan pesan yang sama. Untuk menjadi jelas, jika saya mengetik cd websetelah masuk saya mendapatkan ke folder yang tepat.

Apa yang kulewatkan di sini?

SUNTING:

Kombinasi kutipan / jalur absolut yang berbeda memberikan pesan kesalahan yang berbeda:

LocalCommand "cd web"
/bin/bash: cd web: No such file or directory

LocalCommand cd web
/bin/bash: line 0: cd: web: No such file or directory

LocalCommand cd /home/gareth/web
/bin/bash: line 0: cd: /home/gareth/web: Input/output error

Ini membuat saya berpikir bahwa tanda kutip tidak boleh ada di sana, dan bahwa ada kesalahan lain terjadi.


9
LocalCommand dijalankan pada sistem lokal Anda, bukan sistem jarak jauh.
Steve Kehlet

Jawaban:


25

cd adalah builtin shell. Perintah Local dijalankan sebagai:

/bin/sh -c <localcommand>

Apa yang Anda ingin lakukan tidak dapat sepenuhnya dicapai melalui SSH; Anda perlu memodifikasi shell dengan beberapa cara, misalnya melalui bashrc / bash_profile.

<Mengedit hampir satu dekade kemudian ...>

LocalCommandtoh bukan yang kamu inginkan. Itu dijalankan di mesin Anda . Kamu ingin RemoteCommand. Sesuatu seperti ini bekerja untuk saya:

Host example.net
  RemoteCommand cd / && exec bash --login
  RequestTTY yes

1
Ya, hanya ingin menyebutkan hal yang sama. Anda dapat menempatkan cdperintah di ~/.bashrcserver jauh sebagai gantinya.
vdboor

Itu mengganggu. Seperti yang saya sebutkan di komentar lain, server memiliki sejumlah nama host dan saya ingin memiliki perilaku yang berbeda berdasarkan yang digunakan. Saya kira itu tidak mungkin untuk menentukan mana yang digunakan dari .bashrc?
Gareth

Itu mungkin, mungkin saja tidak disarankan. Sesuatu seperti mengganti ssh dengan skrip shell kecil atau alias yang meneruskan nama host sebagai variabel yang akan diekspor (ala "ssh -t user @ host 'export connhostname = host; bash --login'"). Tapi Anda mulai masuk ke wilayah yang sangat aneh, memang. Mungkin pertanyaan yang lebih baik adalah, MENGAPA Anda menginginkan perilaku ini?
BMDan

Jujur saja bukan masalah yang besar. Saya hanya dalam situasi di mana sebagian besar waktu saya masuk ke server ini, saya langsung menuju ke salah satu dari dua direktori (tergantung pada host mana yang saya gunakan)
Gareth

77

Ini bekerja:

ssh server -t "cd /my/remote/directory; bash --login"

Untuk membuat direktori jika tidak ada:

ssh server -t "mkdir -p newfolder; cd ~/newfolder; pwd; bash --login"

Jika Anda tidak menambahkan bashke ujung jalan maka Anda keluar setelah cdperintah dijalankan. Dan jika Anda tidak menambahkan --loginmaka Anda ~/.profiletidak bersumber.


Ini mengakhiri saya di lokasi yang benar, dengan bash prompt. sempurna!
Peter Ehrlich

Ini juga berfungsi untuk saya, tetapi jika saya mencoba menggunakannya dengan ssh jump-host, itu tidak berfungsi. Saya mendapatkan koneksi pesan tertutup.
Riccardo

43
  1. Masuk ke kotak Anda
  2. Sunting ~/.bash_profile
  3. Di akhir file tambahkan cd /path/to/your/destination
  4. Simpan & keluar
  5. Logout dari kotak
  6. Login lagi dan Anda harus mendarat /path/to/your/destination

3
Pada beberapa mesin Anda mungkin perlu perlu menambahkan cd /path/to/your/destinationuntuk ~/.bashrcbukan ke ~/.bash_profile. Hasilnya harus sama.
Matthias

Ini berfungsi dengan baik terima kasih - apakah itu hanya terbatas pada ID pengguna saya atau apakah itu akan mempengaruhi login pengguna lain juga?
hard_working_ant

@BabyGroot jika Anda memodifikasi ~/.bash_profileatau ~/.bashrchanya akan memengaruhi pengguna saat ini.
rubenvarela

5

Solusi yang lebih kuat untuk case ketika Anda perlu ssh dan mengganti file .bashrc default. Ini berguna dalam kasus-kasus ketika lingkungan server jauh memiliki banyak dokumen dan digunakan oleh banyak pengguna.

alias ssh_myserver='ssh server_name -t "echo cd /path/to/desired/dir>/tmp/.bashrc_tmp; bash --rcfile /tmp/.bashrc_tmp"'

Lebih detail:

  1. Perintah pertama membuat .bashrc_tmpfile dalam /tmpdirektori di server jauh dengan kontencd /path/to/dir
  2. Perintah selanjutnya dijalankan bashdengan file konfigurasi yang ditentukan pada langkah 1. Ini memungkinkan untuk beralih ke dir yang diinginkan dan menekan default .bashrc.
  3. Seluruh perintah ini dibungkus sebagai alias, jadi pada ssh client command prompt dapat disebut sebagaissh_myserver

Kreatif ... selama Anda menulis perms ke / tmp
smci

4

Sudahkah Anda mengaktifkan arahan ini di konfigurasi ssh Anda?

PermitLocalCommand yes

Default untuk itu adalah no, dalam hal ini LocalCommandarahan Anda akan diabaikan.

Atau, sudahkah Anda mencoba menambahkan perintah ke .bashrcfile Anda ?


Arahan itu diatur, ya (dan saya berasumsi saya tidak akan melihat pesan kesalahan ditampilkan jika tidak). Masalah dengan menggunakan .bashrc adalah server memiliki nama host yang berbeda, dan saya ingin nama host yang berbeda untuk diterjemahkan ke direktori awal yang berbeda
Gareth

Kecuali setiap nama host memiliki alamat IP yang berbeda, tidak akan ada cara bagi server untuk mengetahui nama host yang Anda minta. Sementara permintaan HTTP menyediakan header Host: yang ramah untuk mengidentifikasi nama host yang diminta, koneksi SSH tidak.
Fosco

4

Jadi saya telah mencari banyak situs web (stackoverflow, yang ini) tetapi tidak menemukan apa yang saya inginkan. Saya akhirnya membuat skrip shell saya sendiri. Saya menempelkannya di sini. Anda juga dapat menyalinnya direktori di $ PATH.

#!/bin/bash
ssh -t <username@hostname> "cd ~/$1; exec \$SHELL --login"

Jadi setelah ini. Saya lakukan:

connect <foldername>

Catatan: Anda mungkin harus keluar dan masuk lagi setelah mengubah variabel jalur


Saya lebih suka ini daripada saran sebelumnya karena '$ SHELL' selalu valid, sedangkan 'bash' mungkin tidak. Juga penggunaan 'exec' adalah sentuhan yang bagus.
Dave

Penyempurnaan lebih lanjut akan memastikan 'cd' berhasil - "cd ~ / $ 1 && exec ... '
Dave

3

Di Anda ~/.ssh/config:

LocalCommand echo '/home/%r/some/subdir' > /home/%r/.ssh/ssh_cd

Di akhir Anda ~/.bashrc:

if [[ -f $HOME/.ssh/ssh_cd ]]
then
    cd $(<$HOME/.ssh/ssh_cd)
    # uncomment the line below and the file will be removed so the cd won't work
    # unless the file is regenerated since you may not want this to operate for
    # non-ssh logins or for ssh logins that you want to function differently
    # rm $HOME/.ssh/ssh_cd
fi

Saya mencoba melakukan ini menggunakan variabel passing, termasuk dengan variabel yang diekspor, tetapi perintah ini dijalankan di shell yang berbeda.

Ketika menguji apa yang Anda coba lakukan, saya tidak mendapatkan kesalahan ketika saya menggunakan jalur absolut yang tidak dikutip. Saya menambahkan ; pwddi akhir perintah dan direktori yang benar ditampilkan, namun direktori saya berakhir adalah ~. Tidak ada cdperintah di file startup shell saya. Aku mencoba memasukkan berbeda cd somedir; pwddi ~/.ssh/rc(dengan yang lain masih di tempat). The configperintah dijalankan sebelum motd dikeluarkan dan rcperintah dikeluarkan setelah itu, tapi sebelum shell file startup yang bersumber. Jadi sekali lagi, ini terjadi di shell yang berbeda.

Coba teknik passing-by-file dan beri tahu saya jika itu cocok untuk Anda.


2

Sudahkah Anda mencobanya tanpa tanda kutip di sekitarnya? Satu-satunya contoh yang saya lihat tidak memilikinya sehingga dengan itu bisa mencoba mengeksekusi cd \ web sebagai perintah.


Oke, menghapus tanda kutip tampaknya membantu tetapi saya masih memiliki kesalahan (lihat posting yang diedit)
Gareth

1

Anda juga dapat mencoba ini, dengan opsi -t:

ssh server -t "cd /my/remote/directory; bash"

1

Coba gunakan RemoteCommand, misalnya

Host myhost
  HostName IP
  User ubuntu
  IdentityFile ~/.ssh/id_rsa
  RemoteCommand cd web; $SHELL -il

RemoteCommand: Menentukan perintah untuk dijalankan pada mesin jarak jauh setelah berhasil terhubung ke server. ( man ssh_config)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.