Soru SSH'yi belirli bir kabuğu kullanacak şekilde zorla


Kullanıcının varsayılan kabuğunun ne olduğuna bakmaksızın SSH'yi uzak uçta belirli bir kabuğu kullanmaya zorlamak için herhangi bir yol var mı?

Şunlara benzer çözümler denedim:

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

Ancak maalesef uzak uçtaki varsayılan kabuk, "karmaşık, çok satırlı komut" parçasının ayrıştırılmasından sorumludur ve hem Bash hem de C kabuk kullanıcıları için yeterince çalışmaktan kaçınmakta güçlük çekiyorum.


26
2017-07-19 22:51


Menşei


ilgili stackoverflow.com/questions/24993598/ssh-then-change-shell - Trevor Boyd Smith


Cevaplar:


En azından openssh tabanlı sistemlerle bunun mümkün olduğuna inanmıyorum. Eğer kabiliyetiniz varsa, daha iyi bir çözüm, bir kabuk komut dosyası dosyasını sftp yapmak ve daha sonra gönderdiğiniz yöntemle yürütmek olabilir. İstenen kaçma miktarını en aza indirgeme avantajına sahip olacaktı, ancak bunun arkasında bir dosya bırakılacaktı (belki de komut dosyasının son adımı olarak).


7
2017-07-19 23:00



Sonunda yaptım, ama scp kullanıyordum. Harika bir fikir. - plinehan


Heredoc'u kullanın:

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

15
2017-07-20 00:43



stdin'den komutları okumak için bass için "-s" kullanmamalısın? - Weboide
Her zaman gerekli değildir. - Ignacio Vazquez-Abrams
Bunu yapabilsem oy verirdim çünkü komutların stdin'e erişmesini engelliyor ve soru belirli bir kabuğu çağırmaktı. - Eric Woodruff
@EricWoodruff, ... belirli bir kabuğu çağırmak (bu durumda bash) kesinlikle Bu nasıl yapılacağını gösterir. - Charles Duffy
FYI sen de yapabilirsin cat /tmp/tempfile_containing_your_script ssh ${hostname} /bin/bash. Yani bir adım yerine iki adımınız olur: 1. adım komut dosyanızı bir dosyaya kopyalayın, 2. adım catkomut dosyası ssh. - Trevor Boyd Smith


Parola tabanlı değil, anahtar tabanlı girişleri kullanın. Sonra bir tane ekleyebilirsiniz "zorlanmış komutlar" senin kamu ssh anahtarına "Seçenekler" sunucuya kurulu SSH1) durumunda alan (içinde ~ / .Ssh / authorized_keys SSH1 için dosya, ~ / .Ssh2 / yetkilendirme SSH2 için).

İstediğiniz kabuğun çağrılması için zorunlu komutunuzu yapın ...

Daha: Belirli bir anahtara en zorlanmış bir komutu ilişkilendirebilirsiniz. Farklı amaçlar için çoklu zorlanmış komutlara ihtiyacınız varsa, farklı anahtarlar ayarlamanız gerekir. (Tabi ki zor komutla çağıracağınız tek bir betiğe birden çok şey koyabilirsiniz. Ancak zorlu komutların farkında olmalısınız. her zaman Belirli bir hesap / anahtar için çalıştırırsanız, kullanıcı farklı bir şey sorup sormadığına bakılmaksızın kullanıcı giriş yapar. İstenilen orijinal komutu hala onurlandırmak istiyorsanız, nasıl kullanılacağına bir göz atın. $SSH_ORIGINAL_COMMAND değişken...)

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


10
2017-08-01 22:47



İyi şeyler. O'Reilly sayfasındaki bu grafik çok güzel. Bununla birlikte, özel durumumda, bunu yalnızca kendi anahtarlarını doğru şekilde ayarlayan kullanıcıları değil, herhangi bir kullanıcı için zorlayabilmek istiyorum. Ayrıca, sunucu makinelerinde root yok, bu yüzden /etc/sshrc. - plinehan
Peki, her zaman sunucu (veya daha iyi: sunucu üzerinde kontrol yürüten biri) hizmetine bağlandığınızda çekimleri çağırır .... Sunucunun 'sahibi' onunla ne yapılabilir karar verir. - Sizden daha yüksek ayrıcalıklarınız yoksa, herhangi bir kullanıcıyı (kullanıcıları) zorlayamazsınız. - Kurt Pfeifle
İstemci isteğe bağlı komutlar çalıştırabilirse, istemci isteğe bağlı bir kabuk da komut olarak çalıştırabilir. - Eric Woodruff
O'Reilly'ye bağlanan @KurtPfeifle bozuk - Brian Vandenberg
@BrianVandenberg: İpucu için Thx. Bu bağlantıyı şimdi kaldırdım. - Kurt Pfeifle


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

çizgi ile çalıştır:

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

vs bash:

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

Tamamen verilen komutu göstererek beklendiği gibi çalışıyor.


1
2017-10-06 00:36



Hiç de şaşırtıcı değil. Uzak ssh daemon etkili bir şekilde çalışır sh -c "$*". Böylece koşuyorsunuz sh -c "/bin/bash -c echo <(cat)"; echo Komuta kendisi geçti tek argüman -c, ve <(cat) tamamen ayrı bir argümandır. - Charles Duffy


Benzer bir durumla karşılaştım, bir süre sonra sqlplus için ksh coprocess'i kullanmam gerekti ve sadece okuma ve yazmaların gerçekleşmesi gereken bir ssh vardı.

Bunu yapmanın bir yolu, tüm bağımlı komutunuzu uzak makinedeki bir satırda (kullan;;) / usr / bin / ksh olarak yapmaktır. Ö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")

0
2017-11-16 04:41