本当に機能させたい場合は、その方法で実行すると新しいルートシェルを実行し、それ以外の場合は通常のコマンドを実行するというシェル関数を定義できます。sudo cd directorybashsudosudo
他の回答にあるように、ほとんどのユーザーはそれを気にしたくないでしょうが、代わりに次のことをしたいと思うでしょう。
- 実行sudo -s、またはsudo -iあなたがログインシェルをしたい場合(1つの効果があることを覚えてsudo -i、またはrootのホームディレクトリにあなたを開始することである)sudo bashあなたが強制したい場合bashやシェルにオプションを渡すことができます。
- 新しいシェルで実行します。cd directory
- 新しいシェルでrootとして実行する必要のある(その他の)アクションを実行します。
- 完了したら、実行exitして新しいシェルを終了します。これを忘れないことが重要です。なぜなら、意図したよりも多くのアクションをルートとして実行したくないからです!
そのため、必要に応じて、後にsudo続くのときにこれらのアクションの最初の2つをcd実行しsudo、それ以外の場合は通常どおり実行するシェル関数(またはスクリプト)を作成できます。何が起こっているのか理解していない場合、新しいシェルにいることで非常に混乱する可能性があるため、エラーメッセージを理解できない可能性があるため、これを他の方法で成功しない理由を学ぶ代わりにこれを使用しないでください sudo cd発生します)。
このようなシェル関数を作成する方法の1つを次に示します。これは、新しいシェルを使用していること、およびexit終了したら終了する必要があることも思い出させます。(このリマインダーは、スキルレベルのユーザーに役立つ可能性があります。これは、引数として実際のシェルの名前、、またはを使用sudoせず-sに実行すると-i、一般的に新しいシェルに慣れないためです。)
# Make sudo treat "sudo cd [DIRECTORY]" as a special case and start a shell.
sudo() {
    if [ "$#" -eq 2 ] && [ "$1" = 'cd' ]; then
        sudo bash -c '
                if cd -- "$2"; then # When cd fails, its own message is enough.
                    printf "%s: Running %s shell in %s\n" "$0" "$USER" "$2" >&2
                    printf "%s: Type \"exit\" once you are done!\n" "$0" >&2
                    exec bash # Replace this bash shell with an interactive one.
                fi
            ' bash _ "$2" # Use $2 as the dir in the intermediate shell, too.
    else
        command sudo "$@"
    fi
}
これをに入れることもできます~/.bashrcが、これは使用するのに十分な奇妙な方法sudoですが、たまに有効にしたいだけかもしれません。その場合、それを独自のファイルに入れる方が良いです。sudo.bashこれらのコンテンツを使用してホームディレクトリで呼び出されるファイルを作成する場合、sudoを実行することにより、通常のsudoコマンドの代わりに実行されるように、関数を使用可能にできます. ~/sudo.bash。これは現在のシェルとその子シェルで有効になりますが、他のシェルでは有効ではありません。などのファイル.bashrcが実行可能でないのと同じ理由で、sudo.bash実行可能をでマークしないでくださいchmod。これは、スタンドアロンのシェルスクリプトではなく、実際にはライブラリです。あなたがいる場合ましたシェルスクリプトとして実行すると、関数が定義されますが、スクリプトを実行したシェル内でのみ、呼び出し元としてではありません。(もちろん、このためのスクリプトを書くことができますが、これはたまたま私がここで取ったアプローチではありません。)
がsudoシェル関数として現在定義されているかどうかを確認して確認し、現在の定義があればそれを確認するには、を実行しtype sudoます。定義された関数を無効にする(定義を解除する)には、を実行しunset -f sudoます。sudoシェル関数が定義されている場合でも、通常のコマンドを直接手動で実行するには、を実行しcommand sudoます。ただし、あなたがいないことを持っている。このため、それをするsudo機能は、実際に自身がより多くのまたはより少ない二つの引数に渡されたか、それに渡される最初の引数は何でもあるがある時はいつでもことを行いますcd。だからこそ、人々が使用する通常の方法でそれを使用することができますsudo。
上に示したシェル機能は、まだあなたが他の引数を渡すせないことにも注意してくださいsudo、それは治療からそれを防ぐことができますcd特別。シェル関数を拡張してそのケースをサポートすることはできますが、特に実行はサポートされていません。でもない。それが作成するシェルは、あなたが得るものに似ています。コードは実際には実行されませんが、を使用するため、オプションは適切に機能します。実際には、ディレクトリ引数を渡すと2回実行されます(それ以外の場合は0回実行されます)。を実行すると、まず関数を実行しているディレクトリとは別のbashシェルから分岐し、ディレクトリを変更します。それが成功すると、置き換えられますsudo -u user cd directorysudo -i cd directorysudo -ssudo -ssudo bash-cbashcdsudo cd directorysudo そのbashシェルと、使用可能な新しいインタラクティブなシェル。
そのシェル関数が自動的に「正しいことをする」方法の例を次に示します。sudo ls -A /root正常に動作することに注意してください。その後、新しいシェルが作成されcdたディレクトリにアクセスしようとすると、sudo何が起こっているのかがはっきりと思い出されます。
ek@Io:~$ sudo ls -A /root
[sudo] password for ek:
.aptitude      .bashrc  .config  .emacs.d  .nano     .rpmdb
.bash_history  .cache   .dbus    .local    .profile
ek@Io:~$ sudo -k  # invalidates my current timestamp... like I left for a while
ek@Io:~$ sudo cd /root/.local
[sudo] password for ek:
bash: Running root shell in /root/.local
bash: Type "exit" once you are done!
root@Io:/root/.local#
root@Io:/root/.local#
root@Io:/root/.local# exit
exit
ek@Io:~$
sudo cdルートとしても変更できないディレクトリにアクセスしようとすると、エラーメッセージが表示されます。
ek@Io:~$ sudo cd /nonexistent
[sudo] password for ek:
bash: line 1: cd: /nonexistent: No such file or directory
ek@Io:~$ sudo -k
ek@Io:~$ sudo cd /etc/crontab
[sudo] password for ek:
bash: line 1: cd: /etc/crontab: Not a directory
ek@Io:~$
sudo -k上記の例の呼び出しの間に使用して、ディレクトリを変更する前にルートとして認証されることを示しました。しかし、実際にsudo -k自分で走る必要はありません。ので、シェル関数は本当のためだけの薄いラッパーですsudoコマンド、ユーザーの資格情報およびその他の共通のキャッシングsudo行動はまだ正常に動作します。
それはうまく機能し、ちょっときちんとsudoしていますが、同じ名前の関数で実際のコマンドをシャドウイングすることは非常に奇妙です。ほとんどのユーザーは、おそらくちょうどの手順を実行したいと思うでしょうsudo -s、自分自身を。しかし、誰かがこれを望んでいる場合、そしてそれが可能であることを実証したい場合、それはあります。cd directory
               
              
ls -lディレクトリ自体を追加してください。