kabuk betiğinin içinde su kullanma


12

Bir dağıtım işlemini otomatikleştiriyorum ve makinemde yalnızca bir .sh dosyasını çağırabiliyorum, benim yapmamı ve .zip'i sunucuya yüklemesini ve ardından sunucuda bir sürü şey yapmasını istiyorum. Yapmam gereken şeylerden biri kök olmamı gerektiriyor. Yani, ne yapmak istiyorum:

ssh user@172.1.1.101 <<END_SCRIPT
su - 
#password... somehow...
#stop jboss
service server_instance stop
#a bunch of stuff here
#all done!
exit
END_SCRIPT

Bu mümkün mü?


+1 iyi soru. ortak sorun.
gMale

Yanıtlar:


15

Bunun yerine şifresiz bir sudo mu düşündünüz?


1
Geçmişte kullandığım yaklaşım bu. Sudo'yu gerekli komutlarla sınırlandırabilir (hizmeti başlat / durdur), kullanıcının sahip olduğu ayrıcalıkları tam olarak ihtiyacınız olan şeyle sınırlandırabilirsiniz. Hala tıknaz hissediyor, ama çalışıyor.
Mark

Bu aslında yaptığım şey ...
cmcculloh

5

Su yerine, uygun komut (lar) için sudoers olarak ayarlanmış NOPASSWD ile sudo kullanın. İzin verilen komutun olabildiğince sınırlı olarak ayarlanmasını isteyeceksiniz. Sudoer dosya sözdizimine aşina değilseniz, root komutları için bir komut dosyası çalıştırma çağrısı yapmak güvenli olmanın en kolay yolu olabilir. Tüm ortamın yüklenmesini gerektiren komutlar / komut dosyaları için, sudo su - -c commandaşırıya kaçmış olsa da çalışır.



3

Bir komutu SSH'ye bağımsız değişken olarak ileterek o komutu sunucuda çalıştırabilir ve çıkabilirsiniz:

ssh user@host "command to run"

Bu, birden çok komutun listesi için de geçerlidir:

ssh user@host "command1; command2; command3"

Veya alternatif olarak:

ssh user@host "
        command1
        command2
        command3
"

Diğer kullanıcıların benden önce işaret suettiği gibi, sunucuda çalıştırmak, komut dosyasında sonraki komutları kök olarak yürütmek yerine yeni bir kabuk başlatacaktır. Yapmanız gereken şey, ya kullanmaktır sudoveya anahtarla su -cTTY ayırmayı SSH'ye zorlamaktır -t(kök parolayı girmeniz gerekiyorsa gereklidir):

ssh -t user@host 'su - -c "command"'
ssh -t user@host 'sudo command'

Her şeyi özetlemek gerekirse, ne yapmak istediğinizi başarmanın bir yolu:

#!/bin/bash
ssh -t user@172.1.1.101 "
        sudo some_command
        sudo service server_instance stop
        sudo some_other_command
"

Yana sudogenellikle sadece prepending, tekrar kök şifre isteyen önce birkaç dakika size yetki seviyesini hatırlar sudokök olasılıkla sunucuda root olarak komutları çalıştırmak için en kolay yoludur olarak çalıştırmak için gereken tüm komutlara. NOPASSWDKullanıcınız için bir kural eklemek /etc/sudoersişlemi daha da sorunsuz hale getirir.

Umarım bu yardımcı olur :-)


Bu NOPASSWDkuralı eklemekle ilgili daha fazla bilgiye ihtiyacınız varsa , öğesinin altındaki örnekleri kontrol edin man sudoers. Ayrıca, kırılmayı önlemek visudoiçin sudoersdosyanızı düzenlerken kullanmayı unutmayın !
jabirali

Su - -c "komutunu" çalıştıramıyorum. Su için şifreyi nasıl sağlarım?
cmcculloh

su -cBunun yerine kullanmayı seçerseniz sudo, SSH'yi -tbayrakla çalıştırmalısınız - komut yürütüldüğünde sunucuda kök parola istenir. suBir komut satırı argümanı olarak doğrudan bir parola sağlamak ne desteklenir (bildiğim kadarıyla) ne de önerilir - çünkü basit bir komut satırından sağlanan herhangi bir parola da dahil olmak üzere ps -ef | grep sutüm argümanları ortaya çıkarır su...
jabirali

su -cSSH'yi nasıl çağırdığınıza gelince : ssh -t user@host 'su -lc "<br /> echo this is a test <br /> echo this is another test<br /> "<br />'
jabirali

<br />Yukarıdakileri betiğinizdeki yeni satırlarla değiştirin . Konu Dışı: ServerFault yorumlarına yeni satırlar ekleyebilir misiniz? Kod parçacıkları yayınlarken oldukça yararlı olacaktır ...
jabirali

2

Hayır. Parolayı alsanız bile su, suyeni bir kabuk açacak olmanızla uğraşmanız gerekir, bu da daha fazla komutunuzun ona geçirilmeyeceği anlamına gelir. Kök işlemleri için uygun ayrıcalıklarla çağırabilen bir yardımcı yürütülebilir dosya ile birlikte bir komut dosyası yazmanız gerekir.


2
Çoğu su komutu, komutların çalıştırılacağı bağımsız değişken olarak kullanılacak -c seçeneğini kabul eder. Sunucunun kendisinde bir komut dosyası muhtemelen tüm cmds ssh üzerinde gönderme vs muhtemelen en iyi olduğunu kabul ediyorum.
Aaron Bush

1

Bekleme komut dosyası yazın. Bunun için zaten bir cevap bulduğunuzu biliyorum, ancak etkileşimli şifre girişi gerektiren bir grup sunucuya giriş yapmanız gerekiyorsa bu yardımcı olabilir.

Bu TCL tabanlı bir dildir, bu nedenle sade eski kabuk komut dosyalarına kıyasla biraz garip olabilir. Ancak metin girişinin otomasyonunu işler ve tahmin edersiniz ki, herhangi bir otomatik şifre girişi veya ayrıcalıkların artması için herhangi bir tür girdi girmeden önce belirli çıktı parçalarını "bekler".

Kılavuz olarak iyi bir bağlantı: http://bash.cyberciti.biz/security/expect-ssh-login-script/

Sitenin kapanması durumunda:

#!/usr/bin/expect -f
# Expect script to supply root/admin password for remote ssh server
# and execute command.
# This script needs three argument to(s) connect to remote server:
# password = Password of remote UNIX server, for root user.
# ipaddr = IP Addreess of remote UNIX server, no hostname
# scriptname = Path to remote script which will execute on remote server
# For example:
#  ./sshlogin.exp password 192.168.1.11 who
# ------------------------------------------------------------------------
# Copyright (c) 2004 nixCraft project <http://cyberciti.biz/fb/>
# This script is licensed under GNU GPL version 2.0 or above
# -------------------------------------------------------------------------
# This script is part of nixCraft shell script collection (NSSC)
# Visit http://bash.cyberciti.biz/ for more information.
# ----------------------------------------------------------------------
# set Variables
set password [lrange $argv 0 0]
set ipaddr [lrange $argv 1 1]
set scriptname [lrange $argv 2 2]
set arg1 [lrange $argv 3 3]
set timeout -1
# now connect to remote UNIX box (ipaddr) with given script to execute
spawn ssh root@$ipaddr $scriptname $arg1
match_max 100000
# Look for passwod prompt
expect "*?assword:*"
# Send password aka $password
send -- "$password\r"
# send blank line (\r) to make sure we get back to gui
send -- "\r"
expect eof

1

Bunun biraz geç olduğunu biliyorum ama kişisel olarak CPAN'dan temin edilebilen Net :: SSH :: Expect kullanacağım.

http://search.cpan.org/~bnegrao/Net-SSH-Expect-1.09/lib/Net/SSH/Expect.pod


Düzenli ssh / bash komut dosyası kullanamıyorsanız bu durumların çoğunda beklemek gerçekten güzel. Ancak, aynı zamanda hızlı bir şekilde tıknaz hale gelir ve uzak uçta "bulursanız" varsaymanızı sağlar. Hedef sistemi değiştirebilir veya nasıl davrandığını etkileyebiliyorsanız , önce farklı bir rota denemenizi tavsiye ederim. Yine de buraya getirmek için iyi bir nokta.
Theuni

0

'Ssh example.com su -lc "$ cmd"' kullanabilirsiniz.

Komut seçenekleri içerdiğinde, alıntı yapmanız gerekir, aksi takdirde "su" onları yiyebilir ("su: geçersiz seçenek - 'A').

ssh -AX -tt example.com 'su -lc "tmux new-session -A"'
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.