SSH'yi belirli bir kabuk kullanmaya zorla


29

Kullanıcının varsayılan kabuğunun ne olduğuna bakılmaksızın, SSH'yi uzak uçta belirli bir kabuk kullanmaya zorlamanın bir yolu var mı?

Aşağıdakilere benzer çözümler denedim:

ssh host.domain.com /bin/bash -c 'complicated, multi-line command'

Ancak ne yazık ki uzak uçtaki varsayılan kabuk "karmaşık, çok satırlı komut" bölümünü ayrıştırmaktan sorumludur ve hem Bash hem de C kabuk kullanıcıları için çalışmak için yeterince kaçmayı zorlukla yaşıyorum.


Yanıtlar:


8

Bunun mümkün olduğunu sanmıyorum, en azından openssh tabanlı sistemlerde. Yeteneğiniz varsa, daha iyi bir çözüm bir kabuk betiği dosyası oluşturmak ve sonra gönderdiğiniz yöntemle çalıştırmak olabilir. İhtiyaç duyulan kaçma miktarını en aza indirme avantajına sahip olacaktı, ancak kaldırılması gereken bir dosyayı (betiğin son adımı olarak) geride bırakacaktı.


1
Bu sonunda yaptığım şeydi, ama scp kullanıyordum Harika bir fikir.
plinehan

16

Heredoc kullanın:

ssh host.domain.com /bin/bash << EOF
big ugly commands
lots of them
EOF

basd için stdin'den komut okumak için "-s" kullanmamalısınız?
Weboide

Her zaman gerekli değildir.
Ignacio Vazquez-Abrams

Komutların stdin'e erişmesini engellediğinden ve soru belirli bir kabuğu çağırmakla ilgiliyse bunu yapabilirdim.
Eric Woodruff

3
@EricWoodruff ... (bu durumda bash) belirli kabuk çağrılırken olduğunu tam olarak bu gösterileri nasıl ne yapacağını.
Charles Duffy

1
Bilgin de yapabilirsin cat /tmp/tempfile_containing_your_script ssh ${hostname} /bin/bash. Dolayısıyla, bir adım yerine iki adımınız vardır: 1. adım, komut dosyanızı bir dosyaya kopyalayın, 2. adımı catiçin komut dosyasını kopyalayın ssh.
Trevor Boyd Smith

10

Parola tabanlı değil, anahtar tabanlı girişleri kullanın. O zaman bir (listesi) ekleyebilir "zorla komut (lar)" ( 'daki herkese açık ssh anahtarına "seçenekler" (sunucuda yüklü SSH1 durumunda alanında)' de ~ / .ssh / authorized_keys SSH1 için dosyanın , ~ / .ssh2 / SSH2 için yetkilendirme ).

Zorla komutunu ver, böylece istediğin kabuk denir ...

Diğer: Verilen bir anahtara en fazla bir zorunlu komutu ilişkilendirebilirsiniz. Farklı amaçlar için birden fazla zorunlu komut gerektiriyorsa, farklı anahtarlar ayarlamanız gerekir. (Tabii ki, zorunlu komutla çağırdığınız tek bir komut dosyasına birden çok şey koyabilirsiniz. Ancak , kullanıcı oturum açarsa, farklı bir şey isterse sormasın , zorunlu komutların her zaman belirli bir hesap / anahtar için çalıştırıldığını unutmayın. İstenilen orijinal komutu hâlâ onurlandırmak istiyorsanız, $SSH_ORIGINAL_COMMANDdeğişkeni nasıl kullanacağınıza bir göz atın ...)

Google üzerinden "zorunlu komutlar" hakkında bilgi edinin .


İyi şeyler. O'Reilly sayfasındaki grafik çok güzel. Bununla birlikte, benim özel durumumda, bunu sadece anahtarlarını doğru ayarlayan kullanıcılar için değil, herhangi bir kullanıcı için zorlayabilmek istiyorum. Ayrıca sunucu makinelerde de kök kullanmıyorum, dolayısıyla dosyaları düzenleyemiyorum /etc/sshrc.
plinehan

Eh, her zaman sunucudur (veya daha iyisi: sunucuya kontrol uygulayan kişi), hizmetine bağlandığınızda çekimleri arar ... Sunucunun 'sahibi' onunla ne yapılacağına karar verir. - Onlardan daha yüksek ayrıcalıklara sahip değilseniz, herhangi bir kullanıcı (lar) için hiçbir şeyi zorlayamazsınız.
Kurt Pfeifle

İstemci isteğe bağlı komutlar çalıştırabilirse, istemci de komut olarak isteğe bağlı bir kabuk çalıştırabilir.
Eric Woodruff

O'Reilly 'e bağlantı veren @KurtPfeifle bozuldu
Brian Vandenberg

@ BrianVandenberg: Ipucu için Thx. Bu bağlantıyı şimdi kaldırdım.
Kurt Pfeifle

2

-tStandart kabuğu çalıştırıyormuşsunuz gibi başlatmak istediğiniz program için bir takma adın tahsis edilmesini zorlamak için bu seçeneği kullanabilirsiniz . Ardından istediğiniz kabuğu eski düz bir argüman olarak iletin.

Bu teknikle, sadece kurulu olan herhangi bir kabuğu kullanamazsınız, ayrıca tek bir komutla vim ve TTY gerektiren diğer programları da açabilirsiniz. Sizi bir yere giriş yapan ve vim veya bir şey gibi bir dosyayı açan bir kabuk betiği yazıyorsanız, bu harikadır.

me@my-machine $ ssh root@myhost -t bash
root@myhost:~# exit
Connection to myhost closed.
me@my-machine $ ssh root@myhost -t sh
# exit
Connection to myhost closed.
me@my-machine $ 

Bunun bir giriş kabuğu olup olmadığından emin değilim, ancak bash'ın bir giriş kabuğu gibi davranmasını sağlayan seçenekler var, bu nedenle kabuğunuzda da olabilir.


1

Şaşırtıcı bir şekilde, aşağıdakilerle farklı sonuçlar görüyorum:

çizgi koşmak:

ssh eric@172.17.1.241 /bin/bash -c "echo <(cat)"                                              
sh: 1: Syntax error: "(" unexpected

bash'a karşı:

ssh eric@172.17.1.241 '/bin/bash -c "echo <(cat)"'                                            
/dev/fd/63

Tam alıntı komutu gösteriliyor beklendiği gibi çalışıyor.


1
Hiç şaşırtıcı değil. Remote ssh arka plan programı etkin şekilde çalışır sh -c "$*". Böylece koşuyorsunuz sh -c "/bin/bash -c echo <(cat)"; echoKomut kendisi geçirilen tek argümanı -c, ve <(cat)tamamen ayrı bir argümandır.
Charles Duffy

0

Ben de bir süre önce sqlplus için ksh coprocess kullanmam gerektiğine benzer bir durumla karşılaştım ve sadece okudukları ve yazmaları gereken bir ssh vardı.

Bunu yapmanın bir yolu, tüm bağımlı komutunuzu uzaktaki makinede tek bir satıra (kullanım;) / usr / bin / ksh komutuna yönlendirmektir. Örneğin:

host="user@host"

db_conn="ora_user/passwd"

a="select * from dual;"

frmt="set heading off echo off feedback off verify off pagesize 0 termout off"

var=$(ssh ${host} "echo 'sqlplus -silent /nolog |&; sql_pid=\$!; print -p \"conn ${db_conn}\"; print -p \"${frmt}\"; print -p \"${a}\"; print -p \"exit\"; wait \$sql_pid' > /remote_dir/kshcmd.txt; awk '{print \$0}' /remote_dir/kshcmd.txt | /usr/bin/ksh")
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.