ssh, belirli bir kabuk başlatmak ve uzak makinede bir komut çalıştırmak?


11

Birkaç kullanıcının uzaktaki bir makinede aynı kullanıcı hesabını paylaştığı bir durumdayım. Kendi dosyamı yazdığım "kişisel" bir dizin var .zshrcve ben bir yolu var istiyorum:

  1. Uzak makinede ssh config dosyamdaki yönergelerle ssh oturumu başlat (örn. ControlMaster auto)
  2. Bu oturum bir Z kabuğu çalıştırır
  3. Bu bir ishal .zshrcbenim "kişisel" dizinde (değil paylaşılan kullanıcının ana dizinde)

Bu tür ssh oturumlarını başlatmanın bir takma adı veya basit bir yolu olması güzel olurdu (bu yüzden OpenSSH'nin yapılandırma dosyasını kullanmayı düşündüm), ancak başka fikirlere de açığım!

OpenSSH'nin yapılandırma dosyasını mı kullanıyorsunuz?

OpenSSH'nin ssh_config man sayfasında , sunucuya başarıyla bağlandıktan sonra yerel olarakLocalCommand çalışacak bir komut belirtmek için yönergeyi kullanabileceğimi okudum . Bu, dosyaya sunucuya bağlandıktan sonra uzaktan çalıştırılacak komutu söylemenin bir yolu olabileceğini düşündürdü , ancak herhangi bir şey görünmüyor.config


Yapabileceğini sanmıyorum. Ama bunu neden istediğine şaşkınım. Ssh komut satırında zaten bir komut var. Neden kaçamıyorsun ssh mycommand? Ve ssh üzerinden gelen her komuttan önce bazı kurulum komutlarını çalıştırmak istiyorsanız, neden sunucu tarafını yapılandırmıyorsunuz?
Gilles 'SO- kötü olmayı bırak'

Teşekkürler @Guilles. Birden fazla kullanıcının aynı uzak hesabı paylaştığı bir durumdayım, bu yüzden uzaktan oturum açarken birkaç şeyi hızlı bir şekilde ayarlamak istiyorum. Daha spesifik olarak, bir Z kabuğu başlatmak ve .zshrcbelirli bir dizinde (yani "kişisel" bir giriş dizini) çalıştırmak istiyoruz. Denedim ssh -t host_name 'zsh & source /path/to/my_zshrc'ama işe yaramadı (anladım FPATH variable not definedve sanırım çünkü zshçalıştırmadan önce bitirir my_zshrc, bu sadece bir Z kabuğu vermedi)
Amelio Vazquez-Reina

Bence bu OP'nin güncellenmesini hak ediyor, bu yüzden sadece güncelledim.
Amelio Vazquez-Reina

Benzer bir cevabımı aramaya gittikten sonra, bu sorunun yapmaya çalıştığınız şeye oldukça yakın olduğu bana geliyor .
Gilles 'SO- kötü olmayı bırak'

Yanıtlar:


15

Bir komutu uzaktan çalıştırmanın en belirgin yolu ssh komut satırında belirtmektir. Ssh komutu her zaman uzaktaki kullanıcının kabuğu tarafından yorumlanır.

ssh bob@example.com '. ~/.profile; command_that_needs_environment_variables'
ssh -t bob@example.com '. ~/.profile; exec zsh'

Paylaşılan hesaplar genellikle kötü bir fikirdir; mümkünse her kullanıcı için ayrı hesaplar edinin. Paylaşılan bir hesapla sıkışırsanız, bir takma ad yapabilirsiniz:

ssh -t shared-account@example.com 'HOME=~/bob; . ~/.profile; exec zsh'

Ortak anahtar kimlik doğrulaması kullanıyorsanız (tekrar önerilir), tuş başına komutları tanımlayabilirsiniz ~/.ssh/authorized_keys. Daha fazla açıklama için bu cevaba bakınız . ~/.ssh/authorized_keysSunucudaki anahtarınızın satırını düzenleyin (hepsi bir satırda):

command="HOME=$HOME/bob;
     if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
       eval \"$SSH_ORIGINAL_COMMAND\";
     else exec \"$SHELL\"; fi" ssh-rsa AAAA…== bob@some.where

Fantastik @Guilles. Bu siteye yaptığınız katkılar onu hepimiz için çok faydalı bir kaynak haline getiriyor. Çok teşekkürler, gerçekten. Bu arada, execkomuta hakkında bilgim yoktu . Nasıl olduğunu exec zshçağıran farklı zshdoğrudan? Bu özel durumda neden önemlidir?
Amelio Vazquez-Reina

Hmm, koştuğumda ssh -t shared-account@example.com 'HOME=~/bob; exec zsh'anladım HOME=~/bob: command not found. Sanırım devam ediyorum tcsh. Eğer denersem aynı problemi alıyorum HOME=/home/bob. Ben bash ve zsh denedim. Buna neden olabilecek herhangi bir ipucu var mı? Son olarak, yukarıdaki sözdizimi ssh oturumu açıkken beni terk eder mi? (istediğim). Tekrar teşekkürler.
Amelio Vazquez-Reina

1
@intrpc execorijinal kabuğu zsh ile değiştirir; olmadan zsh, orijinal kabuk zsh çıkıp çıkana kadar bellekte kalırdı. Temel fark biraz hafıza tasarrufu yapmak, çok önemli değil. Giriş kabuğunuz (t) csh ise kullanın setenv HOME ~/bob; exec zsh. Son olarak, zsh hiçbir argüman olmadan başlatıldığından, bir kabuk oturumu alırsınız, sanki koştuğunuz sshve giriş kabuğunuz olarak zsh olsaydınız alacağınız gibi .
Gilles 'SO- kötü olmayı bırak'

Yardımın için tekrar teşekkürler. Burada bir takip sorusu. Komuttan sonra daha fazla komut çalıştırmanın herhangi bir yolu var exec zshmı?
Amelio Vazquez-Reina

1
@ AmelioVazquez-Reina Nokta dosyalarından birini kontrol etmedikçe uygun değildir. Ortam değişkenini ZDOTDIR, zsh'nin farklı bir dizindeki nokta dosyalarını arayacak şekilde ayarlayabilirsiniz . Eğer nokta dosyalar üzerinde bir miktar kontrol var o zaman eklenti gibi bir şey yapabilirsiniz eval $LC_STARTUP_CODEiçin $ZDOTDIR/.zshrcve çevre değişkeni yürütülecek kodunu aktaracak LC_STARTUP_CODE.
Gilles 'SO- kötü olmayı kes

-3

Sunucuyu bağladıktan sonra bir komutu uzaktan çalıştırmak için, .ssh / config dosyanıza aşağıdaki snippet'i ekleyin

PermitLocalCommand yes

Host <server-ip-address>
    LocalCommand *command*

2
Teşekkürler @ user626129, ama orijinal soruda belirttiğim gibi LocalCommandyönerge uzak kabuk üzerinde değil , yerel kabuk üzerinde bir komut çalıştırmaktır .
Amelio Vazquez-Reina
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.