700の許可があり、自分が所有していない場合、「cd」コマンドを使用してディレクトリを入力する方法は?


87

私は使用しようとしましsudo cd name_of_dirたが、エラーメッセージが表示されています:

sudo: cd: command not found

700の許可を持つ別のユーザーが所有するディレクトリを入力する他の方法はありますか?


2
ls -lディレクトリ自体を追加してください。
リンツウィンド

7
ここで、有効な回答に対して否定的なコメントを残し続ける理由を説明してください。より良い方法がある(またはそうあるべき)と思われる場合は、それが何であるかをお知らせください。
オリ

1
sudo chmod 0755 name_of_dir; do you business; cd ../; sudo chmod 0700 name_of_dirあなたが満足する唯一の答えのようです。
マルコセッピ

3
ここで与えられた答えは正しいですが、あなたはそれらを投票し、間違っていると言っています。あなたが見た何かのために言われていることをただ退けないでください。
リチャードホロウェイ

3
それは面白いです...彼はsudo cd仕事をしたいのですが、彼はsudoまたはsuを使用して解決策に投票します。彼は、rootとして働きたくないが、まだ所有していない直接アクセスしたいと言います。私にはトロールのように
聞こえ

回答:


111

sudo cdcdコマンドがシェルに組み込まれているため、機能しません。つまり、rootになってからこのコマンドを実行するということです。ルートになり、sudoの後のコマンドが検索されますがcd、見つけるコマンドはありません。

使用する方法は、ディレクトリを所有するユーザーに切り替えることです。許可700は、「所有者が読み取り、書き込み、実行できる」ことを意味します。

したがって、rootがdirectory sudo -i、passwordを所有している場合cd {dir}は、唯一の正しい方法です。他の誰かがディレクトリを所有している場合でも、1番目の方法を使用できますが、そのユーザーに変更してから、そのユーザーとしてsu {username}使用cdすることもできます。


副次的な質問:所有者ではない場合でも、rootは700ディレクトリに入ることができますか?
メストレリオン

3
はい、MestreLion、700はrootの侵入を停止しません。許可 '000'は、ユーザーが自分で入力することを停止します(はい、ユーザーは自分が入力できないディレクトリを作成できます...)が、それでもrootはそのユーザーを入力できます。
リンツウィンド

1
echoはシェルビルトインコマンドです。なぜ「sudo echo」を実行できるのに「sudo cd」は実行できないのですか?
shoujs

申し訳ありませんが、同じルールが適用されsudo echoますecho 'deb {text}' | sudo tee --append {file}。sudoでechoを使用したり、ファイルを変更したりする必要があります。
リンツウィンド

1
なぜcd、に使用できるコマンドに組み込まれてsudoいないのですか?
アーロンフランケ

44

sudo -i

「ルートコンソール」を開いてから

cd /path/to/directory

cdシェル組み込みコマンドであるため、sudoターゲットにすることはできません)


18

ルートディレクトリを開くには、ルートシェルを実行します。例:

sudo su
# cd /root

3
私はルートとして働きたくありません。絶対に!!! また、専門家は決してルートとしてログインしないことを推奨しています。-1
バクティオル

8
それがまさにルートのディレクトリを開くためのアクセス許可を望まない理由です。
Takkat

10
ルートモードに移行しても問題はありません。専門家は、必要な場合は常にrootになることを推奨します。
リンツウィンド

2
rootが所有するもので作業している場合、sudo suing(または別の方法)が唯一の実用的または可能な方法である場合があります。「専門家」は、ルートを習慣として使用しないように指示するだけです-実際に必要な場合は問題ありません。そして、@ Vojtech、不可能は何もありません...
オリ

2
@Bakhtiyor:ずっとルートとして働くことは確かに推奨されません。ただし、単一(または少数)のコマンドに対して発行することは許容されます。特に、ユーザーがにアクセス許可を持たないディレクトリを入力しようとしている場合。したがって、所有者またはルートになる必要があります。
メストレリオン

10

他の人が指摘したように、それは組み込みのシェルです:

~ % which cd
cd: shell built-in command

それでは、なぜシェル自体をsudoしませんか?

~ % sudo $SHELL -c "cd name_of_dir"

5
sudo bash -c idea ...の+1と提案:の使用は避けてくださいwhich。単なるスクリプトであり、すべての可能性(バイナリ、ビルトイン、エイリアスなど)を処理しません。type代わりに使用してください。はるかに安全で強力かつポータブル。そしてtype -p、実行可能ファイルのパス用。
メストレリオン

1
まあ、;-)を依存しtype [ -wfpams ] name ... Equivalent to whence -v.which [ -wpams ] name ... Equivalent to whence -c.(男性のzshbuiltins)
ダニエルBauke

1
依存しませwhenceis zsh-only ... bashでは機能せ、ubuntuにはデフォルトでインストールされません。一方でtypeあるPOSIX、それはで動作する意味任意の近代的なシェルはbash ...、CSH、kshを...とさえzshのは。
メストレリオン

確かに、そういうわけで、私はコメントが表示されたときにそれを支持しましたが、zshでは実際にはスクリプトではなく、type両方が同じコマンドのエイリアスであるため、同様の結果が得られます。
ダニエルバウケ

ああ、私は今理解しています。まあ、しかしそれはzsh。Ubuntuのデフォルト(通常のみ)ターミナルシェルであるbashではwhich、ビルトインではありません... type(またはtype -p)が推奨されます。
メストレリオン

4

次の方法でも、rootユーザーに昇格できます。

sudo -s

次に、次のような通常のユーザーを許可しないディレクトリに移動します。

cd /root

または

cd /var/lib/

その後、そこに入力したら、次のように入力します。

exit

rootユーザー特権からログアウトします。

自分をルートとして昇格させるために、&&次のように演算子ごとに2つのコマンドを組み合わせることもできます。この演算子は、現在のコマンドが正常に実行され、次のコマンドの実行が許可された場合にのみ実行シーケンスも維持します:

sudo -s && cd /var/lib

または

sudo -s && cd /root

2

本当に機能させたい場合は、その方法で実行すると新しいルートシェルを実行し、それ以外の場合は通常のコマンドを実行するというシェル関数を定義できます。sudo cd directorybashsudosudo

他の回答にあるように、ほとんどのユーザーはそれを気にしたくないでしょうが、代わりに次のことをしたいと思うでしょう。

  1. 実行sudo -s、またはsudo -iあなたがログインシェルをしたい場合(1つの効果があることを覚えてsudo -i、またはrootのホームディレクトリにあなたを開始することである)sudo bashあなたが強制したい場合bashやシェルにオプションを渡すことができます。
  2. 新しいシェルで実行します。cd directory
  3. 新しいシェルでrootとして実行する必要のある(その他の)アクションを実行します。
  4. 完了したら、実行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


0

議論するsuかどうかsuについては、ばかげていると思います。suUbuntuの宗教に反しており、不用意にやることではありません。rm -rf *あなたがrootなら、何ができるかは驚くべきことです。ただし、コマンドラインインターフェイス(CLI)に慣れていて、システムレベルのタスクを実行する必要がある場合は、を使用しない理由はありませんsu。私は誰も使用について言及していないいくつかのディストリビューションを使用しましたsudo。それは、あなたがどんな種類の仕事をしていて、どの方法が最も快適かという問題です。私は両方を使用します。


1
「bashのバージョンでは、sudo私はkubuntu lucidを使用していますが、sudo cd回避策なしで動作します。」短いようなもの、私はかなり確信している、デフォルトでUbuntuのではありませんでした、私はどのように表示されません。(また、私は10.04を使用しました;それはしませんでした。)これを投稿してから何年も経ちましたが、詳細を覚えていますか?sudo cdまだあなたのために働きますか?type -a sudoそれが機能するシェルの出力は何ですか?私はあなたが知らないかもしれないことを理解します-そしてあなたの答えの2番目の部分は関連したままです-あなたがそうするならば、あなたはそれについて編集することができます
エリアケイガン

@EliahKagan 16.10では今は間違いなく機能せず、そのとき何をしたか覚えていません。既存の基本コマンドを変更することは私の宗教に反するので、そうすることはまずありません。いずれにせよ、たとえそれが機能したとしても、一般的には機能しないため、誰もがそれを悪い習慣と呼ぶでしょう。
ジョー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.