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
コメント