memuat alias shell lokal ke sesi ssh secara dinamis

24

Ketika saya masuk ke beberapa mesin menggunakan ssh saya berharap alias dan fungsi saya ada di sana. Dengan kata lain, masuk ke beberapa mesin saya berharap saya dapat menggunakan pintasan perintah saya.

Saya membutuhkannya dinamis, setiap kali saya masuk saya berharap saya telah memperbarui alias.

Catatan: Sangat sering ini pertama kali masuk, tanpa mengetahui mesin dan file di sana. Terkadang ini adalah single login. Hanya satu kali untuk mesin itu. Perlu dibersihkan setelah itu, konfigurasi sebelumnya harus dikembalikan juga.

Tomek Wyderka
sumber

Jawaban:

18

Anda dapat menyalin sementara Anda .bashrcke mesin jarak jauh Anda dengan nama lain. Misalnya, menggunakan .bashrc_temp:

user@local$ scp .bashrc user@remote:~/.bashrc_temp

Setelah itu Anda dapat masuk ke mesin jarak jauh:

user@local$ ssh user@remote

dan sourcefile .bashrc_temp:

user@remote$ source ~/.bashrc_temp

Sekarang Anda dapat menggunakan .bashrcfungsi Anda dan Anda. Ketika Anda selesai dengan pekerjaan Anda, Anda dapat menghapus file ~ / .bashrc_temp pada mesin remote dan logout.

Menyalin file dan login ke mesin jarak jauh dapat dilakukan dengan fungsi bash:

# copy the .bashrc to the remote machine 
# and log into the remote machine.
# parameter $1: user@remote
function s() {
  scp ~/.bashrc $1:~/.bashrc_temp
  ssh $1
}

Perbarui :

Anda juga dapat mempertimbangkan untuk menyalin .bashrcke /tmppada mesin dan sumber jarak jauh Anda /tmp/.bashrc_temp.

Pembaruan 2 :

Anda dapat masuk ke mesin jarak jauh dengan menggunakan ssh -t . Ini akan secara otomatis menggunakan temp Anda .bashrc. Fungsi yang diperbarui s():

function s() {
  scp ~/.bashrc $1:/tmp/.bashrc_temp
  ssh -t $1 "bash --rcfile /tmp/.bashrc_temp ; rm /tmp/.bashrc_temp"
}
jens-na
sumber
Ini jelas yang saya cari. Terima kasih! Tetapi mungkinkah melakukannya dengan lebih fungsional? Dalam satu langkah? Karena sekarang kita membutuhkan 3 langkah: masuk, sumber, hapus sebelum keluar.
OK, saya melihat sekarang setelah pembaruan Anda. Besar. Satu lagi perbaikan: "bash --rcfile /tmp/.bashrc_temp; rm /tmp/.bashrc_temp"
Saya telah menambahkan perbaikan Anda ke pembaruan saya 2. Terima kasih.
5
Hampir semua jawaban (termasuk yang ini) menggunakan nama file yang dapat diprediksi di /tmp/. Ini sepele dapat dieksploitasi oleh pengguna lain untuk menjalankan kode apa pun sebagai pengguna yang login. Ini harus digunakan mktempuntuk memastikan file sementara memiliki nama yang unik.
Tometzky
9

jens-na memberikan jawaban yang sangat bagus. Saya menghabiskan sedikit waktu dan kembali bekerja sedikit untuk bekerja sedikit lebih baik. Dengan cara ini, Anda dapat meneruskan parameter apa pun ke SSH, seperti nomor port. Perbedaannya adalah bahwa ia menggunakan sshperintah untuk mengunggah .bashrcfile, alih-alih scp, yang menggunakan nama parameter perintah yang berbeda.

Anda juga akan melihat bahwa itu mengunggah file yang berbeda .bashrc_remote,, sehingga Anda dapat memilih dengan tepat apa yang ingin Anda sumber di server jauh, alih-alih semuanya

sshs() {
        ssh $@ "cat > /tmp/.bashrc_temp" < ~/.bashrc_remote
        ssh -t $@ "bash --rcfile /tmp/.bashrc_temp ; rm /tmp/.bashrc_temp"
}

Jalankan sebagai berikut:

sshs user@server

Nama ' sshs' adalah untuk "Sumber SSH". Gunakan sshsaat Anda tidak ingin sumber, dan gunakan sshssaat Anda melakukannya.

https://gist.github.com/jonahbron/5549848

Jonah
sumber
Itu berguna. Set parameter yang sama, tidak perlu menambahkan entri ke ~ / .ssh / config hanya untuk menentukan port yang berbeda no!
Tomek Wyderka
Karena itu adalah nama perintah yang sama, mungkin mungkin untuk melakukannya dalam sekali jalan, dan ketikkan kata sandi hanya sekali ... Sayangnya menggabungkan perintah Anda ke dalam satu laporan:Pseudo-terminal will not be allocated because stdin is not a terminal
Tomek Wyderka
@ TomekWyderka Ya, saya mencoba sekitar 20 menit untuk mendapatkannya ke satu perintah, tetapi tidak menemukan cara. Mungkin seseorang yang lebih paham BASH daripada yang bisa saya pahami, tetapi tampaknya itu tidak mungkin.
Jonah
2
Saya telah mengambil jawaban ini dan mengulanginya selama beberapa minggu. Hasilnya adalah alat lengkap yang menghancurkan masalah: github.com/Russell91/sshrc
RussellStewart
1
@Jonah bisakah Anda menjelaskan kepada saya mengapa Anda menggunakan $ {*: 1} alih-alih $ @.
RussellStewart
8

Saya pikir sshrc adalah apa yang Anda cari: https://github.com/Russell91/sshrc

sshrc berfungsi seperti ssh, tetapi juga sumber ~ / .sshrc setelah login dari jarak jauh.

$ echo "echo welcome" > ~/.sshrc
$ sshrc me@myserver
welcome

$ echo "alias ..='cd ..'" > ~/.sshrc
$ sshrc me@myserver
$ type ..
.. is aliased to `cd ..'

Anda dapat menggunakan ini untuk mengatur variabel lingkungan, menentukan fungsi, dan menjalankan perintah post-login. Sesederhana itu, dan itu tidak akan berdampak pada pengguna lain di server - bahkan jika mereka menggunakan sshrc juga. Untuk konfigurasi lebih lanjut, lanjutkan membaca.

RussellStewart
sumber
Bagus. Saya suka hack xxd!
Tomek Wyderka
@ Tomek - ya xxd hack benar-benar hebat. Saya benar-benar mencoba menyelesaikan pekerjaan dengan scp. Kemudian dengan piping ke ssh. Itu tidak bisa dilakukan tanpa 2 panggilan ke server - 2 entri kata sandi - 2 perjalanan pulang pergi. Itu tidak bisa diterima. Jadi saya melakukan hal yang tidak terpikirkan.
RussellStewart
Saya punya bug. sshrc hang tanpa respons. Bisakah Anda memasukkan beberapa kode debug (bisa di komentar) ke sshrc sehingga saya bisa melacaknya.
Tomek Wyderka
Menarik. Ini hanya skrip bash jadi biasanya kesalahan atau peringatan yang dilemparkan akan dicetak ke layar secara otomatis. Berapa banyak byte dalam .sshrc.d Anda? Juga, cukup ketik vim $(which sshrc)dan Anda dapat melihat file bash. Anda dapat menambahkan perintah gema setelah setiap baris untuk melihat di mana ia hang.
RussellStewart
5

Tidak yakin dengan keterbatasannya, tetapi saya bisa membuatnya bekerja dengan sesuatu seperti:

function ssh_with_rc() {
   RC_DATA=`cat ${HOME}/.bashrc | base64 -w 0`
   ssh -t $@ "echo \"${RC_DATA}\" | base64 --decode > /tmp/${USER}_bashrc; bash --rcfile /tmp/${USER}_bashrc; rm /tmp/${USER}_bashrc"
}

alias ssh="ssh_with_rc"
Brad
sumber
Ini adalah jawaban terbaik bagi saya karena ini adalah perintah ssh tunggal, tidak ada hal scp. Satu-satunya perbaikan yang tersisa bagi saya adalah menemukan cara untuk menghindari RC_DATAvariabel.
Sridhar Sarnobat
2

Inilah yang saya pikirkan. Hal ini memungkinkan Anda untuk mempertahankan file rc normal, tetapi juga melakukan segalanya dalam satu koneksi ssh (yaitu hanya perlu login sekali sebagai lawan melakukan scp terlebih dahulu).

#copies some environment over to the remote machine
function ssh() {
  /usr/bin/ssh -t $* "echo `base64 -i ~/bin/remote_ssh_env.sh` | base64 --decode > /tmp/remote_ssh_env.sh; bash --rcfile /tmp/remote_ssh_env.sh"
}

Saya tidak yakin seberapa besar file rc itu, karena mungkin maksimal di beberapa titik.

mlathe
sumber
Saya harus membungkus bagian dari perintah dalam tanda kutip tunggal untuk mendapatkan ini berfungsi dengan baik. echo '`base64 .... sh`' - setelah itu, ia bekerja dengan indah. Terima kasih!!
K Robinson
Jika ukuran menjadi masalah, Anda bisa menyalurkan konten file melalui utilitas kompresi seperti gzip sebelum pengkodean base64.
K Robinson
2

Saya pikir https://github.com/fsquillace/pearl-ssh melakukan apa yang Anda butuhkan.

Saya menulisnya sejak lama sebelum sshrc lahir dan memiliki lebih banyak manfaat dibandingkan dengan sshrc:

  • Itu tidak memerlukan dependensi pada xxd untuk kedua host (yang mungkin tidak tersedia di host jarak jauh)
  • Pearl-ssh menggunakan algoritma pengkodean yang lebih efisien
  • Itu hanya ~ 20 baris kode (sangat mudah dimengerti!)

Contohnya:

$> echo "alias q=exit" > ~/.config/pearl/sshrc
$> ssh_pearl myuser@myserver.com
myserver.com $> q
exit
pengguna967489
sumber
1

Salah satu opsi untuk membuatnya bekerja dengan satu sesi SSH adalah menggunakan variabel untuk menyimpan file bash Anda daripada menyalinnya.

$ mybash=`cat mybash`
$ ssh -t 127.0.0.1 "echo $mybash > /tmp/mybash; bash --rcfile /tmp/mybash ; rm /tmp/mybash"

Tampaknya bekerja untuk saya.

gibsop1
sumber
1

Saya mencari untuk memecahkan masalah seperti milik Anda, dan menyadari apa yang sebenarnya saya cari adalah sshfs. Mungkin Anda bisa menggunakannya juga?

Masalah saya adalah ketika ssh'ing, saya ingin menjaga warna, alias, fungsi dan skrip saya saat bekerja jarak jauh.

http://fuse.sourceforge.net/sshfs.html

Didewakan
sumber
Lol, ini tidak pernah terpikir olehku juga. Ini solusi yang cukup kreatif.
Sridhar Sarnobat