エコー -e

エコー -e

シェル スクリプトを使用して共有ディレクトリを設定するためのパスワードを設定したいと思いますsamba。次のスクリプトを作成しましたtest.sh

#!/bin/bash

pass=123456
(echo "$pass"; echo "$pass") | smbpasswd -s -a $(whoami)

次のように出力されます。

When run by root:
    smbpasswd [options] [username]
otherwise:
    smbpasswd [options]

options:
  -L                   local mode (must be first option)
  -h                   print this usage message
  -s                   use stdin for password prompt
  -c smb.conf file     Use the given path to the smb.conf file
  -D LEVEL             debug level
  -r MACHINE           remote machine
  -U USER              remote username
extra options when run by root or in local mode:
  -a                   add user
  -d                   disable user
  -e                   enable user
  -i                   interdomain trust account
  -m                   machine trust account
  -n                   set no password
  -W                   use stdin ldap admin password
  -w PASSWORD          ldap admin password
  -x                   delete user
  -R ORDER             name resolve order

指摘されているように、私はこれを root として実行していませんでしたが、これを root として実行すると、つまり は正常に動作します。ただし、問題は、ログインしているユーザーであるの代わりにsudo ./test.shが追加されることです。rootnoobuser

同様のことをして追加するにはどうすればいいでしょうかnoobuser(ここで何かが欠けているような気がします)?

答え1

テスト:

#!/bin/bash

pass=123456

if [ -z "$SUDO_USER" ]; then
    echo "This script is only allowed to run from sudo";
    exit -1;
fi

(echo "$pass"; echo "$pass") | smbpasswd -s -a "$SUDO_USER"

呼び出し:

sudo ./test.sh

答え2

これは、bash スクリプトを使用して自動化する方法の一部ですsmbpasswd -aが、うまく機能します。

username="bob"

pass="secret"

echo -e "$pass\n$pass" | smbpasswd -a -s $username

これは拡張されており、現在のユーザー名を挿入します。(awk を使用しない場合は短くてきれいです)

pass="secret"

echo -e "$pass\n$pass" | smbpasswd -a -s $(id -un)

詳細は以下をご覧ください:

エコー -e

-e オプションは、echo による改行文字の追加インスタンスの解釈と、\t で表される水平タブなどの他の特殊文字の解釈を有効にするために使用されます。

パイプ記号「|」

Unix 系コンピュータ オペレーティング システムでは、パイプラインはメッセージ パッシングを使用したプロセス間通信のメカニズムです。

https://en.wikipedia.org/wiki/パイプライン_(Unix)

https://superuser.com/questions/756158/linux パイプシンボルの機能

クレジット:ローレンスC、ウィキペディア

smbpasswd -s

-s オプションを指定すると、smbpasswd はサイレント状態 (つまりプロンプトを出さない) になり、古いパスワードと新しいパスワードを標準入力から読み取ります (passwd(1) プログラムのように /dev/tty から読み取るのではなく)。このオプションは、smbpasswd を動作させるスクリプトを作成するユーザーを支援するためのものです。

id -u -n

id指定されたユーザーのシステム ID を表示します。

出力:uid=0(root) gid=0(root) grupy=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

UID/GIDの代わりに名前を表示する

デフォルトでは、id コマンドは -G、-g、および -u オプションの番号を表示します。次のように -n オプションを渡すと、id コマンドに -G、-g、および -u オプションの番号ではなく UID または GID の名前を表示させることができます。

id -ng {UserNameHere}
id -nu {UserNameHere}
id -nG {UserNameHere}
id -nG vivek

詳細はこちらid:https://www.cyberciti.biz/faq/unix-linux-id-command-examples-usage-syntax/

クレジット:ブレット(解決)、ヴィヴェック ジット(詳しい情報)

問題が発生した場合のちょっとしたヒント(出典:ポール:https://superuser.com/a/343163/1169381

答え3

スクリプトに引数を渡したくない場合は、これを試してみてください

#!/bin/bash

pass=123456
echo $pass
echo $pass | smbpasswd -s -a $(who am i | awk '{print $1}')

スクリプトを呼び出します。

答え4

smb.shというファイル名を作成します。内容は次のようになります。

#!/bin/bash

mkdir /home/user_data/$1

#add owner
chown -R $1 /home/user_data/$1
#owner only 
chmod -R 700 /home/user_data/$1


user=$1
pass=$2

#sleep 3
smbpasswd -a $user<<EOF
$pass
$pass
EOF

そして、次のようにsmb.shにパラメータを送信できます。

./smb.sh myusername  mypassword

シンプルに言えば、PHP言語でsmb.shファイルを使うことができ、PHP exec関数を使うことができる。

関連情報