ssh oturumu dinamik yerel kabuk takma adları yükleniyor


24

Ssh kullanarak bazı makinelere giriş yaptığımda, takma adlarım ve işlevlerimin olmasını diliyorum . Başka bir deyişle, bazı makinelere giriş yapmak isterdim Komut kısayollarımı kullanabilmeyi diliyorum.

Dinamik olmasına ihtiyacım var, her giriş yaptığımda Keşke takma adları güncelleseydim.

Notlar: Çok sık sık orada ilk makine ve dosyaları bilmeden, giriş. Bazen tek oturum açmadır. Bu makine için yalnızca bir kez. Daha sonra temizlenmesi gerekir, önceki konfigürasyon da geri yüklenmelidir.

Yanıtlar:


18

.bashrcUzak makinenize başka bir adla geçici olarak kopyalayabilirsiniz . Örneğin, .bashrc_tempşunları kullanarak :

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

Daha sonra uzaktaki makineye giriş yapabilirsiniz:

user@local$ ssh user@remote

ve sourcedosya .bashrc_temp:

user@remote$ source ~/.bashrc_temp

Artık sizin .bashrcve işlevlerinizi kullanabilirsiniz. Çalışmanız bittiğinde uzak makinedeki ~ / .bashrc_temp dosyasını kaldırabilir ve oturumu kapatabilirsiniz.

Dosyanın kopyalanması ve uzak makineye giriş yapılması bir bash işleviyle yapılabilir:

# 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
}

Güncelleme :

Ayrıca kopyalamak düşünebilir .bashrciçin /tmpuzak makinede ve kaynağa /tmp/.bashrc_temp.

Güncelleme 2 :

Uzaktaki makineye ssh -t kullanarak giriş yapabilirsiniz . Bu otomatik olarak temp kullanacaktır .bashrc. Güncellenen işlev s():

function s() {
  scp ~/.bashrc $1:/tmp/.bashrc_temp
  ssh -t $1 "bash --rcfile /tmp/.bashrc_temp ; rm /tmp/.bashrc_temp"
}

Bu kesinlikle aradığım şey. Teşekkürler! Ancak daha işlevsel hale getirmek mümkün mü? Bir adımda mı? Çünkü şimdi 3 adıma ihtiyacımız var: oturum açma, kaynak, oturum kapatmadan önce sil.

Tamam, şimdi güncellemenizden sonra görüşürüz. Harika. Bir düzeltme daha: "bash - rcfile /tmp/.bashrc_temp; rm /tmp/.bashrc_temp"

Düzeltme güncellememi 2 ekledim. Teşekkürler.

5
Hemen hemen tüm cevaplarda (bunun da dahil olduğu) içinde öngörülebilir dosya adı kullanılır /tmp/. Bu, giriş yapan bir kullanıcı olarak herhangi bir kodu çalıştırmak için başka herhangi bir kullanıcı tarafından özel olarak kullanılabilir. Bu mktemp, geçici dosyanın benzersiz bir ad olduğundan emin olmak için kullanılmalıdır .
Tometzky,

9

jens-na mükemmel bir cevap verdi. Biraz zaman harcadım ve ufacık biraz daha iyi çalışmak için biraz çalıştım. Bu sayede port numaraları gibi herhangi bir parametreyi SSH'ye iletebilirsiniz. Aradaki fark, farklı komut parametresi adları kullanan dosyanın yerine dosyayı sshyüklemek için komutu kullanmasıdır..bashrcscp

Ayrıca, farklı bir dosya yüklediğini fark edeceksiniz; .bashrc_remoteböylece her şey yerine uzak sunucularda tam olarak ne sağlamak istediğinizi seçebilirsiniz.

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

Aşağıdaki gibi çalıştırın:

sshs user@server

' sshs' Adı "SSH Kaynağı" içindir. sshKaynak yapmak istemediğiniz zaman kullanın ve istediğiniz sshszaman kullanın .

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


Bu yararlı. Aynı parametre kümesi, sadece farklı port no'ları belirtmek için ~ / .ssh / config girişini eklemeniz gerekmez!
Tomek Wyderka

Aynı komut adı olduğu için, belki tek seferde yapmak ve bir kez şifre girmek mümkündür. Maalesef komutlarınızı tek bir raporda birleştirin:Pseudo-terminal will not be allocated because stdin is not a terminal
Tomek Wyderka

@TomekWyderka Evet, 20 dakika boyunca bir komuta indirmeye çalıştım ama bir yol bulamadım. Belki de çözebildiğimden daha fazla BASH anlayışlı biri, ama mümkün görünmüyor.
Jonah

2
Bu cevabı aldım ve birkaç hafta içinde yineledim. Sonuç, sorunu ezen tam gelişmiş bir
RussellStewart

1
@Jonah, $ @ yerine neden $ {*: 1} kullandığını bana açıklayabilir misin?
RussellStewart

8

Bence sshrc aradığın şey: https://github.com/Russell91/sshrc

sshrc, ssh gibi çalışır, ancak uzaktan oturum açtıktan sonra ~ / .sshrc kaynaklarına da sahiptir.

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

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

Bunu, ortam değişkenlerini ayarlamak, işlevleri tanımlamak ve oturum açma sonrası komutları çalıştırmak için kullanabilirsiniz. Bu kadar basit ve sshrc kullanıyor olsalar bile sunucudaki diğer kullanıcıları etkilemeyecek. Daha gelişmiş yapılandırma için okumaya devam edin.


Güzel. Xxd hack'i seviyorum!
Tomek Wyderka 12:14

@ Tomek - Evet, xxd kesmek tamamen harika. Gerçekten scp ile işi halletmeye çalıştım. Sonra ssh içine boru ile. 2 sunucuya arama yapmadan - 2 şifre girişi - 2 gidiş-dönüş yapılamaz. Kabul edilemezdi. Bu yüzden düşünülemez olanı yaptım.
RussellStewart

Bir hatam var. sshrc yanıt vermeden kilitleniyor. Bazı hata ayıklama kodlarını (yorumlarda olabilir) sshrc içine koyabilir miyim, böylece onu izleyebilirim.
Tomek Wyderka 13:14

İlginç. Bu sadece bir bash betiğidir, bu nedenle genellikle atılan tüm hatalar veya uyarılar ekrana otomatik olarak yazdırılır. .Sshrc.d dosyanızda kaç bayt var? Ayrıca, sadece yazın vim $(which sshrc)ve bash dosyasını görebilirsiniz. Nerede takıldığını görmek için her satırdan sonra yankı komutları ekleyebilirsiniz.
RussellStewart

5

Sınırlamalardan emin değilim, ancak bunun gibi bir şeyle çalışmasını sağlayabildim:

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"

Bu benim için en iyi cevap, çünkü bu tek bir ssh komutu, scp malzemesi yok. Benim için kalan tek gelişme RC_DATAdeğişkenden kaçınmanın bir yolunu bulmaktı .
Sridhar Sarnobat

2

Ben de öyle geldim. Normal bir rc dosyası korumanıza izin verir, aynı zamanda her şeyi bir ssh bağlantısı içinde yapar (örneğin, önce bir scp yapmak yerine sadece bir kez giriş yapmanız gerekir).

#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"
}

Bir noktada en fazla çıkabileceği için bu rc dosyasının ne kadar büyük olabileceğinden emin değilim.


Bu işi düzeltmek için komutun bir kısmını tek tırnak işareti içine almak zorunda kaldım. echo '`base64 .... sh`' - ondan sonra çok güzel çalıştı. Teşekkürler!!
K Robinson

Boyut sorun çıkarırsa, base64 kodlamadan önce dosya içeriğini gzip gibi bir sıkıştırma aracıyla yönlendirebilirsiniz.
K Robinson,

2

Sanırım https://github.com/fsquillace/pearl-ssh ihtiyacınız olanı yapıyor.

Sshrc doğmadan çok uzun zaman önce yazdım ve sshrc ile karşılaştırıldığında daha fazla yararı var:

  • Her iki ana bilgisayar için xxd bağımlılığı gerektirmez (uzak ana bilgisayarda kullanılamayabilir)
  • Pearl-ssh daha verimli bir kodlama algoritması kullanır
  • Bu sadece ~ 20 kod satırıdır (gerçekten anlaşılması kolay!)

Örneğin:

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

1

Tek bir SSH oturumu ile çalışması için bir seçenek bash dosyanızı kopyalamak yerine saklamak için bir değişken kullanmaktır.

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

Benim için iş gibi görünüyor.


1

Seninki gibi bir problemi çözmek istiyordum ve aradığım şeyin sshfs olduğunu anladım. Belki sende kullanabilirsin?

Benim sorunum şşş yaparken, renklerimi, takma adlarımı, işlevlerimi ve senaryolarımı uzaktan çalışırken saklamak istemiştim.

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


Lol, bu benim de başıma gelmedi. Bu oldukça yaratıcı bir çözüm.
Sridhar Sarnobat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.