Memo/Linux/sudo

https://dexlab.net:443/pukiwiki/index.php?Memo/Linux/sudo
 

sudo


環境変数を引き継ぐ

  • CentOS 7.x
  • sudoのオプションが無い場合
    sudo bash -c 'echo $PATH'
    /sbin:/bin:/usr/sbin:/usr/bin
  • -i: rootユーザのデフォルトshellでログインして実行する。
    • /etc/profile.d/ が実行される
      sudo -i bash -c 'echo $PATH'
      /usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/puppetlabs/bin:/root/bin
  • -E: 現在の環境変数を引き継ぐ
    sudo -E VAR1=foo VAR2=bar bash -c 'echo $VAR1 $VAR2'
    foo bar
  • -iE を同時に指定した場合にsudoのバージョンによって、エラーになる。
    • sudo-1.8.6p7-13.el7.x86_64
      sudo -iE echo $PATH
      -bash: PATHの内容...
    • sudo-1.8.23-4.el7.x86_64
      sudo -iE echo $PATH
      sudo: you may not specify both the `-i' and `-E' options

sudo時の補完を有効にする

echo "complete -cf sudo" >> ~/.bashrc

sudoした時に環境変数が変わらない場合

sudo -u した場合、OSのバージョンによってユーザの環境変数が変わらない部分がある

  • CentOS 5.8の場合
    sudo -u zabbixsrv env | grep HOME
    HOME=/root
  • CentOS 6.3の場合
    sudo -u zabbixsrv env | grep HOME
    HOME=/var/lib/zabbixsrv
  • CentOS5でもユーザのHOMEになるように修正
    sudo visudo
    ----
    Defaults    always_set_home
    ----

sudo: sorry, you must have a tty to run sudo

CentOS5.5で、crontab内や/etc/cron.daily/内でsudoを使おうとするとこのエラーが出る。

  • 対策。rootユーザのみtty接続でなくともsudoを許可
    sudo /usr/sbin/visudo
    ----
    Defaults:root !requiretty
    ----
  • もしくはssh -tオプションで実行しろと書いてある
    ssh -t hostname sudo <cmd>

sudoでリダイレクトを含むコマンド

以下の例では「sh -c "..."」を付けないと、「>」の部分が現在のユーザで実行されてしまい、ファイルが作成できない

sudo sh -c "cat > /etc/php.d/json.ini << 'EOS'
extension=json.so
EOS"

sudoを使えるように

  • /etc/sudoers や /etc/sudoers.d/ 以下のファイルが壊れるとsudoができなくなる。そのため、vimよりvisudoの方が安全。visudoは保存時に書式等を検証してくれる。
  • UNIXの慣習としてsudoできるのはwheelグループ。コメントを外す
    sudo visudo
    ----
    %wheel   ALL=(ALL)  NOPASSWD: ALL
    ----
    
    # user01をwheelグループに追加
    usermod -G wheel user01
  • /etc/sudoers.d/ 以下にファイルを作る方がデプロイが楽
    • CentOS6.x
      # userの場合
      sudo visudo -f /etc/sudoers.d/user01
      --
      user01 ALL=(ALL) NOPASSWD: ALL
      --
      
      # groupの場合、%を付ける
      sudo visudo -f /etc/sudoers.d/group01
      --
      %group01 ALL=(ALL) NOPASSWD: ALL
      --
      
      
      # ワンライナーで済ませたい場合
      sudo bash -c "echo 'user01 ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/user01"; sudo chmod 440 /etc/sudoers.d/user01
    • もし ディレクトリが無かったり、設定が必要ならば設定する。(CentOS6.xでは不要だった)。「#includedir」の行頭#はコメントではない
      mkdir /etc/sudoers.d
      chmod 750 /etc/sudoers.d
      
      visudo /etc/sudoers
      --
      #includedir /etc/sudoers.d
      --
  • sudoユーザがrootになりたい時
    sudo su -

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-10-18 (金) 19:55:16 (25d)