bash、新しいシェルを呼び出した後にコマンドを実行する


12

私はこのようなスクリプトを作成しようとしています:

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

実行すると新しいシェルが取得somethingされますがsudo -s、その内部ではなく、で作成されたシェルを終了したときにのみ実行されます。

何か助けは?

回答:


7

問題はsudo -s、引数なしでrootの対話型シェルを開くことです。

を使用して単一のコマンドを実行するsudo -s場合は、次のように簡単に実行できます。

sudo -s command

例えば ​​:

$ sudo -s whoami
root

または、ここで文字列を使用できます。

$ sudo -s <<<'whoami'
root

複数のコマンドがある場合は、ここでdocを使用できます。

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

1
ユーザーがシェルを変更する(かなり貧弱な)アイデアを持っているsudo -s場合にのみ使用するのは適切ではありませんroot。これは実際sudo shには、どのシェルを使用するかを明示的に示しているはずです。
Michael Le BarbierGrünewald2015

7

別の方法は、完全なbashコマンドをに渡すことsudoです。

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

ただし、より良い方法は、代わりにスクリプトを起動するsudoことです。sudoスクリプトの中に入れるのはあまり良い考えではありません。root権限(sudo script.sh)でスクリプト全体を実行する方がはるかに優れています。必要に応じて、を使用sudoして特定のコマンドの特権を削除できます。例えば:

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

上記のスクリプトを実行すると、次が返されます。

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

3

Bourneシェルではあり-cますが、あなたのような何かを書くことができるように、シェルに任意のスクリプトを渡すために使用できるフラグ

sudo sh -c 'something'

ただし、これは最も単純なコマンドにのみ役立ちます。スクリプトを正しく引用するのは非常に面倒であり、sshを介してリモートサーバーにコマンドを送信すると、引数のスクリプトが2回分析されるため、不便さがさらに大きくなります。スクリプトを送信し、スクリプトを実行する側で1回。

somethingが複雑なスクリプトである場合、またはssh行を介して渡される必要がある場合は、標準出力にprepare_something_script「何か」のスクリプトを書き込むことを目的とする関数を作成するのが一般的です。最も簡単な形式では、この関数はヒアドキュメントを使用して出力を生成できます。

prepare_something_script()
{
  cat <<EOF
something
EOF
}

によって生成されたスクリプトprepare_something_scriptは、sudoによって次のように付与された特権でローカルに実行できます。

prepare_something_script | sudo sh

スクリプトをsudoによって付与された特権を使用してリモートで実行する必要があるシナリオでは、次のように、スクリプトをbase 64でエンコードしてsshの標準入力のリダイレクトを回避するのが慣例です。

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

関数でそのコードを使用する場合は、something64変数をローカルとしてマークすることを忘れないでください。base64の一部の実装は-d、デコードするフラグを提供します。これは、詳細な--decodeバリアントよりもサポートが不十分です。一部の実装では、-w 0誤った改行を回避するために、エンコーディングコマンドにを追加する必要があります。


0

次の行ではなく、sudo -sの前にコマンドを追加する必要があります。

sudo -s something...
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.