必要に応じて、私はいつも次のことをします。
su root cmd args
cmd
ルートとして実行しますargs
。マニュアルページには、cmd
ターゲットアカウントのシェルを使用してアイテムを呼び出す方法が記載されています-c
。
しかし、最新のコンピュータの1つでそれを行うと
su root date
それは文句を言う
/usr/bin/date: /usr/bin/date: cannot execute binary file
私は以下-c
を明示的に使用してこの問題を解決できることを発見しました。
su root -c date
ただし、パラメータを含むコマンドはまだ機能しません。言うと
su root -c expr 1 + 2
expr
「オペランドの欠落」について文句を言います。私は解決できますそれすることで
su root -c 'expr 1 + 2'
新しいsu
バージョンです。いいえそこに自分のものを自動的に投げます-c
。
たぶん、いつもこのような習慣を身につけるべきかもしれません。
su root -c 'command args'
しかし、私は以前これをやったことがないので、これについては非常に混乱しています。
最も重要なのは、私の質問は次のとおりです。
su
途中で順番が変わりましたか?- 私はずっと間違って呼んだが、以前のバージョンはもっと寛大でしたか?
- コマンドを渡す正式に正しい方法は何ですか?
(最新バージョンはutil-linux 2.33.1から来たもので、私にとっては非常に面倒です。)
[PSこの質問は具体的にsu
。 ]sudo
sudo
答え1
Gitのリビジョン履歴を見るとわかるように、util-linux
このユーティリティsu
のバリエーションには、-c
コマンドがシェルスクリプトでない限り、実行するコマンドを渡すオプションが常に必要です。
コマンドがユーザーのログインシェル用に作成されたシェルスクリプトの場合、これは必要ありません-c
。使用はsu root ./script
rootとしてログインして実行するのと同じです(これはスクリプトのすべての行を$SHELL ./script
上書きします)。#!
スクリプトいいえrootユーザーのログインシェル用に作成されたこのスクリプトは、su root -c ./script
rootとしてログインして実行するのと同じです(スクリプトの-lineに従います)。./script
$SHELL -c ./script
#!
su
私が知っている限り、これはLinuxではなくシステムで動作する方法です。
以下は少し接線です。
OpenBSDからsu(1)
手動、例えば:
要約
su [-fKLlm] [-a auth-type] [-c login-class] [-s login-shell] [login [shell arguments]]
[...]
オプションの場合シェルパラメータコマンドラインに表示されると、ターゲットログインのログインシェルに渡されます。これにより、
-c
ほとんどのシェルが理解するオプションで任意のコマンドを渡すことができます。通常、-c
1つの引数だけが必要です。複数の単語を渡すときは、それを引用する必要があります。
ここのオプションは-c
のオプションではなく、呼び出しsu
シェルのオプションです。su
この-c
オプションはsu
独立しており、OpenBSDでまったく異なる操作を実行します。 2つの違いは、コマンドラインに表示されるユーザー名の側面です。
OpenBSDはユーザー名の後の引数をルートシェルに渡すので、次のことができます。
$ su root -x -c 'echo hello'
Password:
+ echo hello
hello
set -x
(つまり、シェルでコマンドを有効にして実行します)
GNUコマンドラインの解析は少し奇妙なので(オプションの順序を変更する)、Linuxではまったく同じ方法でこれを行うことはできません。代わりに、次のようにオプションの解析を停止する必要があり--
ます。
$ su root -x -c 'echo hello'
su: invalid option -- 'x'
Try 'su --help' for more information.
(su
解釈-c
して-x
自分の選択で)
% su root -- -x -c 'echo hello'
Password:
+ echo hello
hello
(およびrootユーザーのシェルにsu
渡す)-c
-x
答え2
su
廃止され、以前のバージョンとの互換性のためにのみ存在します。
新しい作業方法:
sudo command arg1 arg2 ...
root でコマンドを実行します。sudo -u someone command arg1 arg2 ...
実行コマンドはsomeone
sudo -i
根になる(この方法を使用している人は頻繁に表示されますsudo su
。この方法も機能しますが、環境設定時に問題が発生したり、su
今後は機能しなくなる可能性があります。)sudo -u someone -i
誰かになりなさい。
su
ルートパスワードが必要な場合は、sudo
自分のパスワードを使用してください。
これはセキュリティの問題のように見えるかもしれませんが、実際にはより良いセキュリティを提供します。完全な内容はマニュアルを参照してください。
システムですでに利用できる可能性が高いですsudo
。そうでない場合は、インストールしてユーザーが次のsudo
グループにいることを確認してください。/etc/group