特定のコマンドでsuを使用する正しい方法は何ですか?

特定のコマンドでsuを使用する正しい方法は何ですか?

必要に応じて、私はいつも次のことをします。

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'

しかし、私は以前これをやったことがないので、これについては非常に混乱しています。

最も重要なのは、私の質問は次のとおりです。

  1. su途中で順番が変わりましたか?
  2. 私はずっと間違って呼んだが、以前のバージョンはもっと寛大でしたか?
  3. コマンドを渡す正式に正しい方法は何ですか?

(最新バージョンはutil-linux 2.33.1から来たもので、私にとっては非常に面倒です。)

[PSこの質問は具体的にsu。 ]sudosudo

ベストアンサー1

Gitのリビジョン履歴を見るとわかるように、util-linuxこのユーティリティsuのバリエーションには、-cコマンドがシェルスクリプトでない限り、実行するコマンドを渡すオプションが常に必要です。

コマンドがユーザーのログインシェル用に作成されたシェルスクリプトの場合、これは必要ありません-c。使用はsu root ./scriptrootとしてログインして実行するのと同じです(これはスクリプトのすべての行を$SHELL ./script上書きします)。#!

スクリプトいいえrootユーザーのログインシェル用に作成されたこのスクリプトは、su root -c ./scriptrootとしてログインして実行するのと同じです(スクリプトの-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ほとんどのシェルが理解するオプションで任意のコマンドを渡すことができます。通常、-c1つの引数だけが必要です。複数の単語を渡すときは、それを引用する必要があります。

ここのオプションは-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

おすすめ記事