Bagaimana saya bisa ssh langsung ke direktori tertentu?

248

Saya sering harus masuk ke salah satu dari beberapa server dan pergi ke salah satu dari beberapa direktori pada mesin tersebut. Saat ini saya melakukan hal semacam ini:

localhost ~] $ ssh somehost

Selamat datang di hosting!

somehost ~] $ cd / some / direktori / suatu tempat / bernama / Foo
somehost Foo] $ 

Saya memiliki skrip yang dapat menentukan host mana dan direktori mana yang perlu saya masuki tetapi saya tidak dapat menemukan cara untuk melakukan ini:

localhost ~] $ go_to_dir Foo

Selamat datang di hosting!

somehost Foo] $

Adakah yang mudah, pintar atau ada cara untuk melakukan ini?

Frosty
sumber

Jawaban:

413

Anda dapat melakukan hal berikut:

ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted ; bash"

Dengan cara ini, Anda akan mendapatkan shell tepat di directory_wanted.


Penjelasan

-tPaksa alokasi pseudo-terminal. Ini dapat digunakan untuk menjalankan program berbasis layar yang sewenang-wenang pada mesin jarak jauh, yang bisa sangat berguna, misalnya saat mengimplementasikan layanan menu.

-tPilihan ganda memaksa alokasi tty, bahkan jika ssh tidak memiliki tty lokal.

  • Jika Anda tidak menggunakan -tmaka tidak akan muncul prompt.
  • Jika Anda tidak menambahkan ; bashmaka koneksi akan ditutup dan mengembalikan kontrol ke mesin lokal Anda
rogeriopvl
sumber
21
dalam kasus saya -t bagian yang hilang
Mathieu
2
Saat menggunakan pendekatan ini .bash_profile tidak dibaca, ada yang tahu mengapa?
Filipe
8
Saya harus melakukan ini: ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && exec \$SHELL"
guptron
40
Anda biasanya menginginkan shell login:ssh -t example.com "cd /foo/bar; exec \$SHELL -l"
christianbundy
10
Hanya ingin menautkan direktori perubahan secara otomatis pada ssh login - Server Fault ; dan dari sana tempel perintah ini (yang merupakan versi dari yang oleh @christianbundy):ssh server -t "cd /my/remote/directory; bash --login"
sdaau
53

Anda bisa menambahkan

cd /some/directory/somewhere/named/Foo

ke .bashrcfile Anda (atau .profileapa pun namanya) di host lain. Dengan begitu, tidak peduli apa yang Anda lakukan atau dari mana Anda sshberasal, setiap kali Anda masuk ke server itu, itu akan cdke direktori yang tepat untuk Anda, dan yang harus Anda lakukan adalah menggunakan sshseperti biasa.

Tentu saja, solusi rogeriopvl juga berfungsi, tetapi ini sedikit lebih bertele-tele, dan Anda harus ingat untuk melakukannya setiap waktu (kecuali jika Anda membuat alias) sehingga sepertinya sedikit kurang "menyenangkan".

Chris Lutz
sumber
1
+1, ini terlihat lebih cocok jika Anda memerlukan direktori konstan daripada membuat perintah ssh lebih lama mengingat setiap kali direktori mana Anda akan pindah ketika Anda terhubung ke mesin X
Tebe
Tidak tepat ketika berubah secara fleksibel
Lewis Chan
21

Saya telah membuat alat untuk SSH dan CD ke server secara berurutan - aptly bernama sshcd . Untuk contoh yang Anda berikan, Anda cukup menggunakan:

sshcd somehost:/some/directory/somewhere/named/Foo

Beri tahu saya jika Anda memiliki pertanyaan atau masalah!

christianbundy
sumber
1
Akan keren jika Anda bisa mendefinisikan konfigurasi baru di ~ / .ssh / config dan membacanya dari sana;)
Alexar
21

Pendekatan pilihan saya adalah menggunakan file konfigurasi SSH (dijelaskan di bawah), tetapi ada beberapa solusi yang mungkin tergantung pada penggunaan Anda.

Argumen Baris Perintah

Saya pikir jawaban terbaik untuk pendekatan ini adalah jawaban christianbundy untuk jawaban yang diterima:

ssh -t example.com "cd /foo/bar; exec \$SHELL -l"

Menggunakan tanda kutip ganda akan memungkinkan Anda untuk menggunakan variabel dari mesin lokal Anda, kecuali jika mereka lolos (seperti di $SHELLsini). Atau, Anda dapat menggunakan tanda kutip tunggal, dan semua variabel yang Anda gunakan akan menjadi yang dari mesin target:

ssh -t example.com 'cd /foo/bar; exec $SHELL -l'

Fungsi Bash

Anda dapat menyederhanakan perintah dengan membungkusnya dalam fungsi bash. Katakanlah Anda hanya ingin mengetik ini:

sshcd example.com /foo/bar

Anda dapat membuat ini berfungsi dengan menambahkan ini ke ~/.bashrc:

sshcd () { ssh -t "$1" "cd \"$2\"; exec \$SHELL -l"; }

Jika Anda menggunakan variabel yang ada pada mesin jarak jauh untuk direktori, pastikan untuk menghindarinya atau memasukkannya dalam tanda kutip tunggal. Sebagai contoh, ini akan cd ke direktori yang disimpan dalam JBOSS_HOMEvariabel pada mesin remote:

sshcd example.com \$JBOSS_HOME

File Konfigurasi SSH

Jika Anda ingin melihat perilaku ini sepanjang waktu untuk host tertentu (atau apa saja) dengan perintah ssh normal tanpa harus menggunakan argumen baris perintah tambahan, Anda dapat mengatur RequestTTYdan RemoteCommandopsi dalam file konfigurasi ssh Anda.

Misalnya, saya ingin mengetik hanya perintah ini:

ssh qaapps18

tetapi ingin selalu berperilaku seperti perintah ini:

ssh -t qaapps18 'cd $JBOSS_HOME; exec $SHELL'

Jadi saya menambahkan ini ke ~/.ssh/configfile saya :

Host *apps*
    RequestTTY yes
    RemoteCommand cd $JBOSS_HOME; exec $SHELL

Sekarang aturan ini berlaku untuk semua host dengan "aplikasi" di nama hostnya.

Untuk informasi lebih lanjut, lihat http://man7.org/linux/man-pages/man5/ssh_config.5.html

Drew
sumber
13

Berdasarkan tambahan pada jawaban @ rogeriopvl, saya menyarankan yang berikut:

ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && bash"

Perintah chaining oleh &&akan membuat perintah berikutnya berjalan hanya ketika yang sebelumnya berhasil (bukan menggunakan ;, yang mengeksekusi perintah secara berurutan). Ini sangat berguna ketika perlu ke cddirektori melakukan perintah.

Bayangkan melakukan hal berikut:

/home/me$ cd /usr/share/teminal; rm -R *

Direktori teminaltidak ada, yang menyebabkan Anda tetap berada di direktori home dan menghapus semua file di sana dengan perintah berikut.

Jika Anda menggunakan &&:

/home/me$ cd /usr/share/teminal && rm -R *

Perintah akan gagal setelah tidak menemukan direktori.

Bas Peeters
sumber
1
Menggunakan tanda kutip tunggal dan bukan tanda kutip ganda dengan perintah tanpa && satu kali dan itu menggigit saya di pantat, buruk ... belajar pelajaran saya.
Gavin Pickin
4

Dalam kasus saya yang sangat spesifik, saya hanya ingin menjalankan perintah di host jarak jauh, di dalam direktori tertentu dari mesin slave Jenkins:

ssh myuser@mydomain
cd /home/myuser/somedir 
./commandThatMustBeRunInside_somedir
exit

Tapi mesin saya tidak bisa melakukan ssh (saya tidak bisa mengalokasikan pseudo-tty kurasa) dan membuat saya memberikan kesalahan berikut:

Pseudo-terminal will not be allocated because stdin is not a terminal

Saya bisa menyelesaikan masalah ini lewat "cd to dir + my command" sebagai parameter dari perintah ssh (untuk tidak harus mengalokasikan terminal-Pseudo) dan dengan meneruskan opsi -T untuk secara eksplisit memberitahu perintah ssh yang saya tidak lakukan membutuhkan alokasi pseudo-terminal.

ssh -T myuser@mydomain "cd /home/myuser/somedir; ./commandThatMustBeRunInside_somedir"
Mauricio Reis
sumber
3

Saya menggunakan variabel lingkungan CDPATH

Eddy
sumber
Berguna hanya jika saya tertarik pada satu direktori per mesin. Saya perlu cara untuk menyampaikan informasi ke mesin jarak jauh. Solusi Roger tidak hanya itu.
Frosty
2

melangkah lebih jauh dengan -tgagasan itu. Saya menyimpan satu set script yang memanggil yang di bawah ini untuk pergi ke tempat-tempat tertentu di host saya yang sering dikunjungi. Saya menyimpan semuanya ~/bindan menyimpan direktori itu di jalur saya.

#!/bin/bash

# does ssh session switching to particular directory
# $1, hostname from config file 
# $2, directory to move to after login
# can save this as say 'con' then
# make another script calling this one, e.g.
# con myhost repos/i2c

ssh -t $1 "cd $2; exec \$SHELL --login"
DKebler
sumber
1

Cara lain untuk langsung setelah masuk adalah membuat "Alias". Ketika Anda masuk ke sistem Anda cukup ketik alias itu dan Anda akan berada di direktori itu.

Contoh: Alias ​​= myfolder '/ var / www / Folder'

Setelah Anda masuk ke sistem Anda ketik alias itu (ini bekerja dari bagian mana pun dari sistem)
perintah ini jika tidak di bashrc akan bekerja untuk sesi saat ini. Jadi, Anda juga dapat menambahkan alias ini ke bashrc untuk menggunakannya di masa mendatang

$ myfolder => membawa Anda ke folder itu

penderita insomnia
sumber
-3

SSH sendiri menyediakan sarana komunikasi, tidak tahu apa-apa tentang direktori. Karena Anda dapat menentukan perintah jarak jauh mana yang harus dijalankan (ini - secara default - shell Anda), saya akan mulai dari sana.

Jan Jungnickel
sumber
4
Ini adalah jawaban parsial, bukan solusi.
AL
-7

cukup modifikasi rumah Anda dengan perintah: usermod -d /newhome username

Borja Moll
sumber
1
Tidak disarankan Mengganti direktori home Anda mungkin akan menyebabkan hal lain rusak.
bronson