アプリ版:「スタンプのみでお礼する」機能のリリースについて

#!/bin/bash

FILE_U="/home/samba/mail_add.txt"
FILE_P="/etc/passwd"

newusers $FILE_U

for line in `cat $FILE_U`
do
user_name=`echo $line | cut -d ':' -f 1`
pass=`echo $line | cut -d ':' -f 2`
txt=`cat $FILE_P | grep -e "^$user_name:"`
user_id=`echo $txt | cut -d ':' -f 3`
group_id=`echo $txt | cut -d ':' -f 4`
home_dir=`echo $txt | cut -d ':' -f 6`
##パスワード生成
PASSWORD=`perl -e "print(crypt('${pass}', 'a5'));"`
useradd -u ${user_id} -g ${group_id} -d ${home_dir} -m -p ${PASSWORD} ${user_id}
cp -rf /etc/skel/* $home_dir/
chown -R $user_id $home_dir
chmod 711 $user_id $home_dir
chgrp -R $group_id $home_dir
echo -n > /home/$user_name/.forward
echo '\'$user_name >/home/$user_name/.forward
echo '|/usr/local/bin/mailtrans.php' >>/home/$user_name/.forward
done

あるサイトで発見したシェルスクリプトを参考にして、少し修正しました。
Centos7ではエラーも無く上手くできましたが、
RedHat7.3で実行すると、下記のエラーが出て、ユーザー登録ができません。
Centos7とRedHat7.3のシェルスクリプトの書き方は違うのでしょうか?

newusers: 1 行: 不正な行です
newusers: 2 行: 不正な行です
newusers: 3 行: 不正な行です
newusers: 4 行: 不正な行です
newusers: 5 行: 不正な行です
newusers: エラーが検出されました。変更は行いません
useradd: '-g' はユ−ザ ID に使えません
chown: オペランドがありません
Try 'chown --help' for more information.
chmod: `711' の後にオペランドがありません
Try 'chmod --help' for more information.
chgrp: オペランドがありません
Try 'chgrp --help' for more information.
/usr/local/bin/users_add.sh: 行 23: /home/t-hayashi3109/.forward: そのようなファイルやディレクトリはありません
/usr/local/bin/users_add.sh: 行 24: /home/t-hayashi3109/.forward: そのようなファイルやディレクトリはありません
/usr/local/bin/users_add.sh: 行 25: /home/t-hayashi3109/.forward: そのようなファイルやディレクトリはありません

使ったtxtファイルは以下です。
t-aaaaa:t-aaaaa3109L:::t-aaaaa3109:/home/t-aaaaa3109:/bin/bash
t-bbbbb:t-bbbbb3114L:::t-bbbbb3114:/home/t-bbbbb3114:/bin/bash
t-ccccc:t-ccccc4233L:::t-ccccc4233:/home/t-ccccc4233:/bin/bash
n-ddddd:n-ddddd9992L:::n-ddddd9992:/home/n-ddddd9992:/bin/bash
y-eeeee:y-eeeee2704G:::y-eeeee2704:/home/y-eeeee2704:/bin/bash

「sh chmod: `711' の後にオペランドがありません」等で検索したのですが、思うような情報がヒットしませんでした。
どなたか、力を貸していただけないでしょうか。
よろしくお願いします。

A 回答 (2件)

sh chmod: `711' の後にオペランドがありません


 ということは
chmod 711
 というコマンドを実行した、ということです。
※ オペランド(被演算子)とは https://ja.wikipedia.org/wiki/%E8%A2%AB%E6%BC%94 …

そこから逆算すると
chmod 711 $user_id $home_dir
の $user_id も $home_dir も空ではないか、ということが予測付きます。
そう仮定すると
useradd -u ${user_id} -g ${group_id} -d ${home_dir} -m -p ${PASSWORD} ${user_id}
 が
useradd -u -g -d -m -p
 となって、 -u の引数として -g が指定されている、となるので
useradd: '-g' はユ−ザ ID に使えません
 となるのも納得できます。
※ シェルスクリプトでは、変数展開やファイル転換が終わった最後の状態で、コマンドを実行します。

そこから逆算すると
user_id=`echo $txt | cut -d ':' -f 3`
が期待通りの結果になっていない、ということです。
ということは、
・$txt が不正
・cut コマンドが不正
が考えられます。
ここで、デバッガを使ったり、$txtを出力したりするれば、状況がわかるはずです。


newusers: 1 行: 不正な行です
 と出ていることから、
/home/samba/mail_add.txt
がなにか期待と違うものになっていて、 newusersでエラーになっているようです。

その後の
txt=`cat $FILE_P | grep -e "^$user_name:"`
でpasswdファイルから取り出そうにもnewusersがエラーだったので該当エントリーが無いから、$txtも空→user_id等も空となっているのでしょう。


/home/samba/mail_add.txt を徹底的に確認するのが、まず第一歩です。
    • good
    • 1
この回答へのお礼

連絡が遅れて申し訳ありませんでした。
丁寧な解説まで付けていただき、ありがとうございました。

> /home/samba/mail_add.txt を徹底的に確認するのが、
> まず第一歩です。

mail_add.txtを見直しました。質問欄に記載したデータと実際にテストしたデータが違っていることに気づきました。
てっきり同じデータを使っているものと思いこんでしまっていました。おかげでさまでシェルスクリプトのことが勉強できました。本当にありがとうございました。

お礼日時:2017/02/21 02:15

RHEL7のソースは確認できませんでしたが…



>newusers: 1 行: 不正な行です
となるのは入力ファイルのフィールド数(':'で区切られた数)が7個になっていない時…のようです。
該当箇所は下記の通り。

/*
* Break the string into fields and screw around with them.
* There MUST be 7 colon separated fields, although the
* values aren't that particular.
*/
for (cp = buf, nfields = 0; nfields < 7; nfields++) {
 fields[nfields] = cp;
 cp = strchr (cp, ':');
 if (NULL != cp) {
  *cp = '\0';
  cp++;
 } else {
  break;
 }
}
if (nfields != 6) {
 fprintf (stderr, _("%s: line %d: invalid line\n"),
   Prog, line);
 errors++;
 continue;
}

RHEL7では要求するフィールドの数が違う…んでしょうかね?
CentOS7とRHEL7でこの辺りに差が出るとは思えませんけど…。
# 最初は改行コードが変なんじゃないかな?と思いましたが…
# CentOS7ではCR/LFでもLFでも受け入れましたねぇ…。(RHELがCR/LF受け入れない…とか?)
# ただ…passwdファイル見るとシェルの所にCR付いていますから、この後ちゃんと動作するのかは…どうなんですかね?

>txt=`cat $FILE_P | grep -e "^$user_name:"`

該当行だけ取り出したいなら…
txt=`getent passwd $user_name`
でもいいんじゃないですかねぇ…。

あとは…エラー処理ちゃんとやった方がいいかと。
    • good
    • 0
この回答へのお礼

> となるのは入力ファイルのフィールド数(':'で区切られた数)
> が7個になっていない時…のようです。

ご指摘の通りでした。
ありがとうございました。

お礼日時:2017/02/21 02:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています