sudoでcdができない場合の対処方法

sudoでcdができない

letsencryptで作成した鍵について確認したくて、cdで/etc/letsencrypt/live/に移動しようとしたらPermission deniedで移動することができませんでした。

$ cd /etc/letsencrypt/live/
-bash: cd: /etc/letsencrypt/live/: Permission denied

sudoでcdを実行しようとすると、command not found(コマンドが見つかりません)といってエラーになってしまいました。

$ sudo cd /etc/letsencrypt/live/
sudo: cd: command not found

sudoでcdを行う方法を調べてみたところ、下記のことがわかりましたので、その内容を忘れないようメモしておきます。

  • sudoでcdするにはサブシェルとして実行する必要がある
  • cd実行後に元のディレクトリに戻ってしまうので、そのまま実行しても意味がない

cdを実行する方法

結論から説明すると、サブシェルとして実行することでcdを実行することができるようになります。

$ sudo sh -c "cd /etc/letsencrypt/live"

ただし、sudoでcdは実行できるのですが、cd実行後にsudoを実行する際にいたディレクトリに戻ってきてしまうので、そのままでは意味がありませんでした。

shに-xオプションを指定してシェルの実行状態を表示させると、「cd /etc/letsencrypt/live」が実行されていることが分かります。

その後にpwdで今いるディレクトリを確認すると、cd実行前のディレクトリのままでした。

$ pwd
/home/tamohiko
$ sudo sh -cx "cd /etc/letsencrypt/live"
+ cd /etc/letsencrypt/live
$ pwd
/home/tamohiko

cdと他のコマンドを組み合わせる

cdコマンドを実行しても元のディレクトリに戻って来るだけでしたが、cdコマンドのあとに「;」(セミコロン)をつけてlsコマンドを組み合わせることで、ディレクトリの中を確認することができました。

$ sudo sh -cx "cd /etc/letsencrypt/live; ls"
+ cd /etc/letsencrypt/live
+ ls
test.server-memo.net  README  test2.server-memo.net
$ pwd
/home/tamohiko

lsコマンド以外も下記のような書式で組み合わせることができます。

$ sudo sh -c "cd 移動したいディレクトリ; コマンド"

ただ、cdをつかわずフルパスを指定してコマンドを実行したほうが簡単ですよね…

$ sudo ls /etc/letsencrypt/live
test.server-memo.net  README  test2.server-memo.net

コメント

タイトルとURLをコピーしました