73279


**現象**  
ShellScriptを実行したときに、ユーザーをrootになることができない。

**期待値**  
ShellScriptを実行したときに、ユーザーをrootにしたい。

**再現手順**  
下記のシェルスクリプトを実行しました。

[code]

    #!/bin/bash
    
    sudo sh -c "
    
    if [ "whoami" = "root" ]; then
     echo OK
    else
     echo NG
    fi
    
    apt update
    apt upgrade
    
    #以下省略
    "
    
[/code]


CC BY-SA 4.0
2021-01-13T14:31:04.007
73275
2021-01-13T15:45:04.653
2021-01-13T15:08:02.063
36906
36906
question
bash shellscript
ShellScriptを実行したときに、ユーザーをrootにできません


とりあえず、「if」〜「fi」までを実験してみたところ、こんな問題がありました。

  1. if文以下の「"」は「\」でエスケープしないと、そこで閉じ扱いになってしまう
  2. 「whoami」は「`」で囲わないと、ただの「whoami」という文字列になってしまう
  3. 「`」も「\」でエスケープしないと、スクリプト実行時点（sudo実行前）に展開されてしまう

これらを直してみたのが以下になりますので、試してみてください。

[code]

    #!/bin/bash
    
    sudo sh -c "
    if [ \`whoami\` = \"root\" ]; then
      echo OK
    else
      echo NG
    fi
    "
    
[/code]


CC BY-SA 4.0
2021-01-13T15:31:48.233
73278
2021-01-13T15:31:48.233
7900
73275
answer


スクリプト中のダブルクォート`"`の使い方がいろいろとおかしいと思います。

  1. まず`sudo sh -c "`で始まるダブルクォート`"`とスクリプト中に含まれているダブルクォート`"`が重複していて構文的におかしくなっています。
  2. また`sudo sh -c`で使用するクォートはその内部の展開が外側のシェルスクリプトの側で行われてしまうのを極力避けるためにシングルクォート`'`で囲むべきです。
  3. `"whoami"`はその文字列そのものではなく、`whoami`コマンドの出力結果文字列を取得することを意図していると思われるので、ダブルクォート`"`ではなくバッククォート「`」で囲む必要があります。

とりあえず以上のことを加味した修正例が以下のようになります。

[code]

    #!/bin/bash
    
    sudo sh -c '
    
    if [ `whoami` = "root" ]; then
        echo OK
    else
        echo NG
    fi
    
        apt update
        apt upgrade
    
    #以下省略
    '
    
[/code]

またそもそも、処理をわざわざ`sudo sh -c`で囲まない書き方にすればもっとすっきりと記述できるはずだと思います。


CC BY-SA 4.0
2021-01-13T15:38:49.120
73279
2021-01-13T15:45:04.653
2021-01-13T15:45:04.653
30745
30745
73275
answer