本当に機能させたい場合は、その方法で実行すると新しいルートシェルを実行し、それ以外の場合は通常のコマンドを実行するというシェル関数を定義できます。sudo cd directory
bash
sudo
sudo
他の回答にあるように、ほとんどのユーザーはそれを気にしたくないでしょうが、代わりに次のことをしたいと思うでしょう。
- 実行
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 directory
sudo -i cd directory
sudo -s
sudo -s
sudo bash
-c
bash
cd
sudo cd directory
sudo
その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
ディレクトリ自体を追加してください。