suコマンドでこのスクリプトI / Oリダイレクトを使用します。

suコマンドでこのスクリプトI / Oリダイレクトを使用します。

これは私のスクリプトです。他のユーザーとしてログインして次のことをしたいと思いますls -lih

#!/bin/bash

su - testuser <<- _EOF_
    123456 #password
    _EOF_

ls -lih

スクリプト実行時の出力は次のとおりです。

./script.sh
-bash: line 1: 123456: command not found
total 127M
 262210 drwxr-xr-x.  9 mazimi mazimi 156K Feb 14 19:05 Desktop
 262211 drwxr-xr-x.  2 mazimi mazimi  36K Feb 14 18:26 Downloads
 278106 -rw-r--r--   1 mazimi mazimi  64K Feb 14 22:30 ems.cfg
 ... # list of files

私のホームディレクトリにありませls -lihんかtestuser?どうすれば修正できますか?

答え1

コードにはいくつかの問題があります。

  1. suパスワードは で読むのでは/dev/ttyなく で読み込まれるstdinので、このようにパスワードをリダイレクトすることはできません。実際、suデフォルトはターゲットユーザーとしてシェルを起動することなので、次のコマンドを実行すると次のようになりますroot

    su - testuser <<- _EOF_
    123456 #password
    _EOF_
    

    成功しますsu(ルートはこれを行うためにパスワードを必要としません)。しかし、123456ユーザーシェルに入力として渡されます。したがって、スクリプトを実行すると、次の内容が表示されます。

    -bash: line 1: 123456: command not found
    

    root以外のユーザーとしてこれを行うには、bahamtのアドバイスに従い、sudo他のユーザーが特定のコマンドにパスワードなしでアクセスできるように構成できるようにする必要があります。

  2. 動作してもsu新しいプロセスが作成されます。コマンドが実行される前にsuコマンドが終了し、元のアカウントに返されましたls。だからあなたが本当に欲しいものは:

    su - testuser <<EOF
    ls -lih
    EOF
    

答え2

私の考えでは、あなたはそれを修正することができないことを知っていると思います。私の考えにはパスワードがsu読み込まれたようですが/dev/tty、実際に該当魔法デバイスファイルにリダイレクトすることはできないと思います。

Linuxを使用している場合は、su読み取りコンテンツを使用してパスワードを確認できますstrace

答え3

あなたが本当に使用したいことはですsudo

あなたは始めたいと思うかもしれませんここ

関連情報