(Dockerを介したCentosで)
visudo
を使用してsudoerを追加できることを知っています。コマンドラインから直接sudoerリストにユーザーを追加する方法はありますか?インタラクティブに追加する必要はありませんか?
対話性で動作しないDockercentosコンテナをプロビジョニングしようとしているので質問しています。
cat
を使用して、/etc/sudoers
の末尾にテキストを追加できます。まず、/etc/sudoers
ファイルのバックアップコピーを作成します。次に:
cat >> /etc/sudoers
...type one or more lines here...
[control-D]
1つだけではなくtwoより大きい文字(>>
)を使用するようにしてください。そうしないと、ファイルの内容全体が上書きされます。
Dockerコンテナを取得して、jenkinsスクリプトがパスワードの入力を求めずにSudoコマンドを使用できるようにしようとすると、同様の問題が発生しました。
これはDockerfileを介して解決されました:
RUN echo "jenkins ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
これを行うには、sudoers
ファイルに次の行があることを確認する必要があります。
%Sudo ALL=(ALL:ALL) ALL
上記の行をカスタマイズして、%Sudo
がユーザーであるかのように権限を変更できます。この行により、Sudo
グループのすべてのユーザーがSudo
を使用できるようになります。
<username>
がSudo
を使用できるようにするには、ルートとしてusermod -a -G Sudo <username>
を実行するだけで、<username>
がSudo
グループに追加されます。
ubuntu:18.04
のベースイメージを使用してroot以外のユーザーを設定する方法は次のとおりです。
RUN \
groupadd -g 999 foo && useradd -u 999 -g foo -G Sudo -m -s /bin/bash foo && \
sed -i /etc/sudoers -re 's/^%Sudo.*/%Sudo ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
sed -i /etc/sudoers -re 's/^root.*/root ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
sed -i /etc/sudoers -re 's/^#includedir.*/## **Removed the include directive** ##"/g' && \
echo "foo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
echo "Customized the sudoers file for passwordless access to the foo user!" && \
echo "foo user:"; su - foo -c id
上記のコードで何が起こりますか:
foo
が作成されます。foo
は、foo
グループとSudo
グループの両方に追加されます。uid
およびgid
は999
の値に設定されます。/home/foo
に設定されます。/bin/bash
に設定されています。sed
コマンドは、/etc/sudoers
ファイルをインライン更新して、foo
およびroot
ユーザーがSudo
グループにパスワードなしでアクセスできるようにします。sed
コマンドは、サブディレクトリ内のすべてのファイルがこれらのインライン更新をオーバーライドできるようにする#includedir
ディレクティブを無効にします。特権アクセスを必要とするファイルに追加するための一般的な配置は、tee
を使用することです。もちろん、その主な目的は2つの場所に書き込むことですが、そのうちの1つを破棄して、Sudo tee -a
が特権追加を与える副作用を使用することができます。
だから、
printf 'you ALL=(ALL:ALL) ALL\n' | Sudo tee -a /etc/sudoers >/dev/null
この特定の問題を解決する代わりに、コメントに同意して、ユーザーをsudoers
グループに追加します。
この投稿の時代を考えると、より現代的な方法は、ユーザーごとのファイルを/etc/sudoers.d/
または参照しているOSの適切な同様の場所に配置することです。 sudoers
ファイルに次のような行が含まれている限り:
#includedir /etc/sudoers.d
次に、このようなスクリプトを使用して、任意の有効なユーザー名のユーザーごとのsudoersファイルを作成できます。
#/usr/bin/env bash
SUDOERS_DIR='/etc/sudoers.d/'
if [ $# -eq 1 ]
then
printf '%s ALL=(ALL:ALL) ALL\n' "$1" > "$SUDOERS_DIR$1" && \
chmod 600 "$SUDOERS_DIR$1"
else
printf 'usage: $0 (username)\n'
printf '(username) will be given Sudo privileges\n'
exit 1
fi
これにより、特権のないユーザーは次のようになります。
/home/jim> Sudo -i
Password:
jim is not in the sudoers file. This incident will be reported.
ユーザーごとにSudoアクセスを簡単に付与できます。
/root# ./addsudo.sh
usage: $0 (username)
(username) will be given Sudo privileges
/root# ./addsudo.sh jim
/root# ls -l /etc/sudoers.d/
total 1
-rw------- 1 root wheel 22 Oct 4 15:35 jim
/root# cat /etc/sudoers.d/jim
jim ALL=(ALL:ALL) ALL
そして出来上がり:
/home/jim> Sudo -i
Password:
/root#
Sudo
特権を取り消すときが来たら、そのユーザーのファイルをrm
するだけです。
# rm /etc/sudoers.d/jim
Sudoersで「wheel」グループを有効にすることから始めて、ユーザーをそのグループに追加するだけで済みます。 sudoersファイルの畳み込みを回避します。
ユーザー作成時に、次の方法でユーザーsomeoneがSudoグループに属することを指定できます。
useradd --groups Sudo someone
すでに存在するユーザーの場合は、次の方法で新しいグループに追加できます。
gpasswd --add someone Sudo
gpasswd
よりもusermod
を好む理由を知りたい場合は、 この回答 を参照してください。