Bash, yeni bir kabuk çağırdıktan sonra komutu yürüt


12

Böyle bir komut dosyası yapmaya çalışıyorum:

#!/bin/bash
sudo -s
something...

Ben yürüttüğümde, yeni bir kabuk alıyorum ama içinde somethingyaratılan kabuktan çıktığımda yürütüyorum sudo -s.

Herhangi bir yardım?

Yanıtlar:


7

Sorun sudo -sherhangi bir argüman olmadan kök için interaktif bir kabuk açılacaktır.

Yalnızca tek bir komutu kullanarak çalıştırmak istiyorsanız sudo -s, şunları yapabilirsiniz:

sudo -s command

Örneğin :

$ sudo -s whoami
root

Veya burada dizeleri kullanabilirsiniz:

$ sudo -s <<<'whoami'
root

Birden fazla komutunuz varsa, burada kullanabilirsiniz doc:

$ sudo -s <<'EOF'
> whoami
> hostname
> EOF
root
something--

1
Kullanıcının kabuğunu değiştirme fikri (oldukça zayıf) sudo -solması durumunda kullanmak iyi değildir root. Bu, sudo shhangi kabuğun kullanılacağını açıkça belirten şey olmalıdır.
Michael Le Barbier Grünewald

7

Başka bir yol, tam bir bash komutunu / komutlarını şu noktalara iletmek olacaktır sudo:

#!/bin/bash
sudo bash -c 'command1; command2; command3;'

Bununla birlikte, komut dosyasını bununla başlatmak daha iyi bir yol olacaktır sudo. sudoSenaryonun içinde olmak çok iyi bir fikir değil . Tüm betiği kök ayrıcalıklarıyla ( sudo script.sh) çalıştırmak daha iyi . Gerekirse, sudobelirli komutların ayrıcalıklarını bırakmak için kullanabilirsiniz . Örneğin:

#!/usr/bin/env bash
whoami
echo $HOME
sudo -u terdon whoami  ## drop privileges for specific command.

Yukarıdaki komut dosyasını çalıştırmak şunu döndürür:

$ sudo ~/scripts/a.sh
root
/root
terdon

3

Bourne kabuğu bir sahiptir -cgibi bir şey yazmak, böylece sen kabuğuna keyfi bir komut dosyası geçmek için kullanabilirsiniz bayrağı

sudo sh -c 'something'

Bununla birlikte, bu sadece en basit komutlar için yararlıdır, çünkü komut dosyasını doğru bir şekilde alıntılamak çok zahmetlidir ve komutu ssh üzerinden uzak bir sunucuya gönderirseniz rahatsızlık daha da yüksektir, çünkü argüman komut dosyası bir kez yanda iki kez analiz edilir betiği göndermek ve betiği çalıştıran tarafta bir kez.

Eğer somethingkarmaşık bir komut dosyası veya bir geçti gereken ssh hattı, bir fonksiyon yazmak için genel bir uygulamadır prepare_something_scriptiş komut dosyası 'şey' yazmaktır Stdout'a . En basit haliyle, bu işlev çıktısını oluşturmak için bir burada-belge kullanabilir:

prepare_something_script()
{
  cat <<EOF
something
EOF
}

Tarafından üretilen komut dosyası prepare_something_scriptdaha sonra sudo tarafından verilen ayrıcalıklarla yerel olarak yürütülebilir :

prepare_something_script | sudo sh

Komut tarafından verilen ayrıcalıklarla uzaktan yürütülmelidir senaryoda sudo bunun standart girdinin önlemek için tabanın 64 kodlamayı gelenektir ssh bu gibi:

something64=$(prepare_something_script | base64)
ssh usesr@remote-host "echo ${something64} | base64 --decode | sudo sh"

Bu kodu bir işlevde kullanırsanız, something64 değişkenini yerel olarak işaretlemeyi unutmayın . Base64'ün bazı uygulamaları, -dkod çözme için ayrıntılı bir bayraktan daha az desteklenen bir bayrak sunar --decode. Bazı uygulamalar, -w 0sahte satır kesmelerini önlemek için kodlama komutuna bir ek eklemeyi gerektirir .


0

Komutu sonraki satır yerine sudo -s önüne eklemeniz gerekir.

sudo -s something...
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.