Pertanyaan Bagaimana saya dapat secara otomatis mengubah direktori pada ssh login?


Saya mencoba untuk mendapatkannya ssh untuk secara otomatis mengubah ke direktori tertentu ketika saya masuk. Saya mencoba untuk mendapatkan perilaku yang 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 sudah pasti ada web folder di direktori home saya. Bahkan menggunakan jalur absolut memberikan pesan yang sama. Agar jelas, jika saya mengetik cd web setelah masuk saya masuk ke folder yang benar.

Apa yang kulewatkan di sini?

EDIT:

Berbagai kombinasi tanda kutip / jalur absolut 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 seharusnya ada di sana, dan bahwa ada kesalahan lain yang terjadi.


77
2017-08-05 14:40




LocalCommand dijalankan pada sistem lokal Anda, bukan sistem jarak jauh. - Steve Kehlet
Lihat disini superuser.com/a/124110/47962 - Nakilon


Jawaban:


cd adalah shell builtin. LocalCommand dijalankan sebagai:

/bin/sh -c <localcommand>

Apa yang ingin Anda lakukan tidak dapat diselesaikan melalui SSH; Anda perlu memodifikasi cangkang dengan cara tertentu, mis. melalui bashrc / bash_profile.


18
2017-08-05 15:52



Ya, hanya ingin menyebutkan sama. Anda bisa meletakkannya cd perintah masuk ~/.bashrc di server jarak jauh. - vdboor
Itu mengganggu. Seperti yang saya sebutkan di komentar lain, server memiliki sejumlah hostname dan saya ingin memiliki perilaku yang berbeda berdasarkan yang digunakan. Saya kira itu tidak mungkin untuk menentukan yang digunakan dari .bashrc? - Gareth
Itu mungkin, mungkin saja tidak disarankan. Sesuatu seperti mengganti ssh dengan skrip shell kecil atau alias yang melewati nama host sebagai variabel yang akan diekspor (a la "ssh -t pengguna @ host 'ekspor connhostname = host; bash --login'"). Tapi kamu mulai masuk ke wilayah yang sangat aneh. Mungkin pertanyaan yang lebih baik adalah, MENGAPA Anda menginginkan perilaku ini? - BMDan
Ini bukan masalah besar untuk jujur. Saya hanya dalam situasi di mana sebagian besar waktu saya login ke server ini saya langsung menuju ke salah satu dari dua direktori (tergantung pada host yang saya gunakan) - Gareth


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 bash ke ujung jalan kemudian Anda keluar setelah cd perintah berjalan. Dan jika Anda tidak menambahkan --login lalu Anda ~/.profile tidak bersumber.


76
2017-12-21 21:29



Ini berakhir saya di lokasi yang benar, dengan prompt bash. sempurna! - Peter Ehrlich
Ini bekerja untuk saya juga tetapi jika saya mencoba menggunakannya dengan ssh jump-host tidak berfungsi. Saya mendapatkan pesan koneksi tertutup. - Riccardo


  1. Masuk ke kotak Anda
  2. Edit ~/.bash_profile 
  3. Di ujung file tambahkan cd /path/to/your/destination
  4. Simpan & keluar dari editor Anda
  5. Keluar dari kotak
  6. Login lagi dan Anda harus mendaratkan /path/to/your/destination

39
2018-02-27 11:04



Pada beberapa mesin Anda mungkin perlu menambahkan cd /path/to/your/destination untuk ~/.bashrc bukannya ke ~/.bash_profile. Hasilnya harus sama. - Matthias
Ini bekerja dengan sempurna - apakah itu hanya terbatas pada user id saya atau akan mempengaruhi login pengguna lain juga? - barry_allen
@BabyGroot jika Anda memodifikasi ~/.bash_profile atau ~/.bashrc itu hanya akan mempengaruhi pengguna saat ini. - rubenvarela


Solusi yang lebih kuat untuk kasus ini ketika Anda perlu meng-ssh dan mengesampingkan file .bashrc default. Ini berguna dalam kasus ketika lingkungan server jauh memiliki beberapa docroots 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 dibuat .bashrc_tmp file di /tmp direktori di server jauh dengan konten cd /path/to/dir
  2. Selanjutnya jalankan perintah bash dengan 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 command prompt client ssh itu bisa disebut sebagai ssh_myserver

5
2017-08-21 11:53



Kreatif ... selama Anda memiliki izin menulis ke / tmp - smci


Sudahkah Anda mengaktifkan arahan ini di konfigurasi ssh Anda?

PermitLocalCommand yes

Standarnya adalah no, dalam hal ini Anda LocalCommand direktif akan diabaikan.

Atau, apakah Anda sudah mencoba menambahkan perintah ke Anda .bashrc mengajukan?


4
2017-08-05 14:47



Arahan itu diatur, ya (dan saya menganggap saya tidak akan melihat pesan kesalahan yang ditampilkan jika tidak). Masalah dengan menggunakan .bashrc adalah bahwa server memiliki nama host yang berbeda, dan saya ingin nama host yang berbeda 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. Meskipun permintaan HTTP menyediakan host yang ramah: header untuk mengidentifikasi nama host yang diminta, koneksi SSH tidak. - Fosco


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 menempel 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 perlu keluar dan masuk lagi setelah mengubah variabel jalur


4
2017-11-25 03:10



Saya lebih suka ini untuk saran sebelumnya karena '$ SHELL' selalu valid, sementara 'bash' mungkin tidak. Juga penggunaan 'exec' adalah sentuhan yang bagus. - Dave
Penyempurnaan lebih lanjut akan memastikan 'cd' berhasil - "cd ~ / $ 1 && exec ... ' - Dave


Di dalam 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 kelulusan variabel, termasuk dengan variabel yang diekspor, tetapi perintah ini dijalankan di shell yang berbeda.

Saat menguji apa yang Anda coba lakukan, saya tidak mendapatkan kesalahan ketika saya menggunakan jalur absolut tanpa tanda kutip, omong-omong. saya tambahkan ; pwd pada akhir perintah dan direktori yang benar ditampilkan, namun direktori yang saya masuki adalah ~. Tidak ada cd perintah dalam file startup shell saya. Saya mencoba meletakkan yang berbeda cd somedir; pwddi ~/.ssh/rc (dengan yang lainnya masih di tempat). Itu config perintah dijalankan sebelum motd dikeluarkan dan rc perintah dikeluarkan setelah itu, tetapi sebelum file startup shell bersumber. Jadi sekali lagi, itu terjadi di shell yang berbeda.

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


3
2017-08-05 18:21