本記事はQNAPにSSHで接続してユーザー管理をするために、私が試行錯誤したときの記録です。
不明なところがたくさんあるので、もしよろしければアドバイスを頂けると幸いです。
- きっかけ
- SSHの導入
- SSHでログイン
- コマンド一覧
- 豆知識
- ユーザーを追加
- ユーザーを削除
- グループを追加
- グループを削除
- ユーザーをグループに追加
- ユーザーをグループから除外
- エイリアスの表示
- 組み込みコマンドの表示
- まとめ
きっかけ
今までQNAPのユーザー登録は、管理コンソールのGUIの「ユーザーのインポート/エクスポート」からcsvを投入して対応していた。
ところが、この方法では
- ユーザーが削除出来ない
- ユーザーをグループから除外できない
という問題があるため、これらの操作は手動での対応となり、正直に言うとちゃんと削除しているか怪しい。
今後もユーザーの部署移動や増減は発生するし、どんどん悪化して行く恐れがあるので解消しておきたい。
QNAPはTelnetやSSHで接続して、コマンドで操作することができるらしいので試してみることにした。
なお、私がSSHを使用するのはこれが初めてなルーキーなので、本書の内容が必ずしも適切とは限らないことに留意すること。
SSHの導入
Windows10 Spring Creators Update(1803)以降はOpenSSHクライアントの機能がデフォルトで導入状態されており、何も考えなくてもssh
コマンドが使える。
Windows10 Fall Creators Update(1709)では、以下の手順を踏めばSSHクライアントが利用できるようになった。
- Windowsロゴキーを押す
Option
と入力オプション機能を追加する
を起動- 「機能の追加」から「OpenSSH Client(Beta)」をインストール
- PCを再起動
更に古いWindows PCの場合は、自力でSSHをするソフトを入手してインストールする必要があるが、私には必要なかったので試していない。
インストール方法はググればいくらでもでてくるので省略する。
なお、QNAPのコマンドはbusybox
が提供しているらしい?(よく分かってない)
SSHでログイン
※実際のサーバーのIP/ユーザー名とは異なります。
とりあえずPowerShellを起動してssh
と入力したら解説が出てきた。
PS C:\Users\*****> ssh usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file] [-J [user@]host[:port]] [-L address] [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] [-Q query_option] [-R address] [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]]
これを参考に、それっぽいのを打ち込んでみた。
失敗例
ssh -b 192.168.1.123 -D 22 -l admin
色々やってたら、こんなエラーが出た。(英文+Google翻訳)
The authenticity of host '192.168.1.123 (192.168.1.123)' can't be established. RSA key fingerprint is SHA256:cX+YK1g4mOvWauaiisXJlERwzdyUOExHJbZA1OnfVJA. Are you sure you want to continue connecting (yes/no)? ホスト '192.168.1.123(192.168.1.123)'の信頼性は確立できません。 RSAキーのフィンガープリントはSHA256です:cX + YK1g4mOvWauaiisXJlERwzdyUOExHJbZA1OnfVJA。 接続し続けますか?(はい/いいえ)? Warning: Permanently added '192.168.1.123' (RSA) to the list of known hosts. 警告:既知のホストのリストに '192.168.1.123'(RSA)を恒久的に追加しました。 Bad local forwarding specification '192.168.1.123' 不正なローカル転送指定 '192.168.1.123'
これは私の手に負えそうにない。
というわけで、SSH ログイン
でググって出てきた例を色々試すことにした。
成功例
入力フォーマット
ssh ユーザー名@サーバーのIPアドレス パスワード
入力例
ssh admin@192.168.1.123 hogehoge
コマンド一覧
まず、どこから手を付けたら良いのやら。
コマンドリファレンスみたいなものが公開されているのでは?
と思ったが、上手く見つけられない。
listとかhelp的なコマンドで一覧が出てくるのでは?
と思ったが、そんな都合よくは出てこない。
Linuxコマンドに広げて、コマンド一覧の取得方法を調べてみたが、QNAPで動くサンプルが見つけられなかった。
そん中、ふとQNAP コマンド一覧
で検索していたら以下のサイトにコマンドのリストを発見した。
http://qnap.web.fc2.com/04/0017.html
この中からuser
とかgroup
とか、それっぽい名前を探して適当に使ってみる。
豆知識
- コマンド名だけを打ち込むと解説文が出てくる
- clsと入力するとコマンドのログがリセットされる
あたりまえって言わないで!
ユーザーを追加
コマンド
ユーザーの追加はadduser
を使うらしい。
[~] # adduser BusyBox v1.24.1 (2018-12-28 02:18:55 CST) multi-call binary. Usage: adduser [OPTIONS] USER [GROUP] Create new user, or add USER to GROUP -h DIR Home directory -g GECOS GECOS field -s SHELL Login shell -G GRP Add user to existing group -S Create a system user -D Don't assign a password -H Don't create home directory -u UID User id -k SKEL Skeleton directory (/etc/skel) QNAP Options: -p PASSWD Change user passwor
成功例
ただの追加ならこれで出来た。
入力文
adduser aaa aaa aaa
実際の画面
[~] # adduser aaa Changing password for aaa New password: Retype password: Password for aaa changed by admin
実際にユーザーが作成された。
さらに、自動的にユーザー名と同じ名前のグループが作成され、グループに追加されていた。
失敗例
すでにユーザーが存在する時はこんな文章
[~] # adduser bbb adduser: user 'bbb' in use
説明欄に書き込む
QNAPのユーザー管理画面には「説明」欄がある。
他のOSでもあるように、好きな言葉を書ける欄だ。
「説明」欄はコマンドに-g 文章
を追記すれば良いことがわかった。
上記の通り-g
の解説はGECOS GECOS field
となっているが、見かけない言葉なので調べてみた。
https://uc2.h2np.net/index.php/GECOS%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89
というわけでGECOS情報とは、コメントフィールドのことらしい。
グループを指定
グループの指定をしない場合、自動的にユーザー名と同じグループが作成され登録状態となるが、-G
で明示的に指定することができるらしい。
なお一部のLinuxでは-N
で自動作成を拒否できるようだが、QNAPは対応していなかった。
それなのに、明示的にグループを指定する場合は、先にグループを用意しておかないとエラーが出てしまった。
[~] # adduser eee -G GroupEEE adduser: unknown group GroupEEE
でも、よく見ると-G
の解説にはっきりと書いてあった。
Add user to existing group
なんともチグハグな仕様である。
また、後述するが複数のグループに同時に追加するような事はできなかった。
ユーザーを削除
ユーザーの削除はdeluser
を使用するらしい。
成功例
can't find
なので、失敗したのかと思いきや正常に削除されたときのメッセージらしい。
[~] # deluser aaa deluser: can't find aaa in /etc/config/group
失敗例
ユーザーが存在しない時、以下のようになる。
[~] # deluser aaa deluser: unknown user aaa
また、自動作成されたユーザー名と同一のグループは、ユーザー削除とともに削除された。
グループを追加
グループを作成するにはaddgroup
を使う。
Usage: addgroup [-g GID] [-S] [USER] GROUP Add a group or add a user to a group -g GID Group id -S Create a system group
成功例
単純に実行すると以下のようになる。
成功したとも。失敗したとも言わない。ナニコレ
[~] # addgroup GroupAAA [~] #
作成されたグループは、完全に空っぽの状態。いずれのユーザーも追加されていない。
失敗例
すでに存在するものを作ろうとすると、以下のようにエラーが出た。
[~] # addgroup GroupAAA addgroup: group 'GroupAAA' in use
グループを削除
削除する時はdelgroup
を使う。
成功例
こちらも成功したら何も返事はない。
[~] # delgroup GroupAAA [~] #
失敗例
グループが無い時は叱られる。
[~] # delgroup GroupAAA delgroup: unknown group GroupAAA
グループ内にユーザーが存在する時、以下のようになる。
[~] # delgroup ccc delgroup: 'ccc' still has 'ccc' as their primary group! (delgroup: 'ccc'はプライマリグループとして 'ccc'を持っています。)
どうにかしてグループを空っぽにする必要があるようだ。
ユーザーをグループに追加
作成済みのユーザーをグループに追加するには、適したコマンドが見つからない。
CSVからのインポートの場合は、単純に同じユーザーとグループの組み合わせを複数行にして送ればよかったのだが、adduser
コマンドは同じユーザーに二度使うとエラーとなるため追加できなかった。
[~] # adduser bbb -G GroupBBB adduser: user 'bbb' in use
adduser
でグループを複数指定出来ないかと思ったが、最初の1つ目しか認識されなかった。
[~] # adduser aaa -G Group1 Group2
-Gを繰り返せばよいのかと思ったのだが、今後は最後の1つしか認識されなかった。
[~] # adduser bbb -G Group1 -G Group2
別のサイトを参考にコマンドをあたっていたらusermod
が使える事が判明した。
[~] # usermod Usage: usermod [options] LOGIN Options: -c, --comment COMMENT new value of the GECOS field -d, --home HOME_DIR new home directory for the user account -e, --expiredate EXPIRE_DATE set account expiration date to EXPIRE_DATE -f, --inactive INACTIVE set password inactive after expiration to INACTIVE -g, --gid GROUP force use GROUP as new primary group -G, --groups GROUPS new list of supplementary GROUPS -a, --append append the user to the supplemental GROUPS mentioned by the -G option without removing him/her from other groups -h, --help display this help message and exit -l, --login NEW_LOGIN new value of the login name -L, --lock lock the user account -m, --move-home move contents of the home directory to the new location (use only with -d) -o, --non-unique allow using duplicate (non-unique) UID -p, --password PASSWORD use encrypted password for the new password -s, --shell SHELL new login shell for the user account -u, --uid UID new UID for the user account -U, --unlock unlock the user account
https://eng-entrance.com/linux-command-groupmod
しかし、使い方がわからん。。。
usermod -u aaa -G GroupAAA
とか、それっぽいのを作ってみたが、
GroupAAAは存在ません。
というエラーで進まなかった。
ユーザーをグループから除外
一度登録したユーザーをグループから除外するには、適したコマンドが見つからない。
調べているとgroupmod
やmodgroup
の事例が見つかったが、QNAPはどちらも使えなかった。
もしかしたらusermod
で出来るのかもしれないが、やはり使い方がわからない。
エイリアスの表示
参考までにalias
コマンドでエイリアスを一覧表示できた。
[~] # alias af='ps af' bc='calc -Cd ' calc='calc -Cd ' cls='clear' df='df -h' indent='indent -bad -bap -bbo -nbc -br -brs -c33 -cd33 -ncdb -ce -ci4 -cli0 -cp33 -cs -d0 -di1 -nfc1 -nfca -hnl -i4 -ip0 -l75 -lp -npcs -npsl -nsc -nsob -nss -ts4 ' ll='/bin/ls -laFh' ls='/bin/ls -F' minicom='minicom -c on' ps1='ps faxo "%U %t %p %a" ' ps2='ps facux ' smb21enable='/etc/init.d/smb2_protocol.sh enable 21' smb2disable='/etc/init.d/smb2_protocol.sh disable' smb2enable='/etc/init.d/smb2_protocol.sh enable' smb2status='/etc/init.d/smb2_protocol.sh status' smb3enable='/etc/init.d/smb2_protocol.sh enable 3' usb_qa_status='/etc/init.d/smb2_protocol.sh usb_qa_status'
組み込みコマンドの表示
help
コマンドで組み込みコマンドを一覧表示できた。
[~] # help GNU bash, version 3.2.57(1)-release (x86_64-QNAP-linux-gnu) These shell commands are defined internally. Type `help' to see this list. Type `help name' to find out more about the function `name'. Use `info bash' to find out more about the shell in general. Use `man -k' or `info' to find out more about commands not in this list. A star (*) next to a name means that the command is disabled. JOB_SPEC [&] (( expression )) . filename [arguments] : [ arg... ] [[ expression ]] alias [-p] [name[=value] ... ] bg [job_spec ...] bind [-lpvsPVS] [-m keymap] [-f fi break [n] builtin [shell-builtin [arg ...]] caller [EXPR] case WORD in [PATTERN [| PATTERN]. cd [-L|-P] [dir] command [-pVv] command [arg ...] compgen [-abcdefgjksuv] [-o option complete [-abcdefgjksuv] [-pr] [-o continue [n] declare [-afFirtx] [-p] [name[=val dirs [-clpv] [+N] [-N] disown [-h] [-ar] [jobspec ...] echo [-neE] [arg ...] enable [-pnds] [-a] [-f filename] eval [arg ...] exec [-cl] [-a name] file [redirec exit [n] export [-nf] [name[=value] ...] or false fc [-e ename] [-nlr] [first] [last fg [job_spec] for NAME [in WORDS ... ;] do COMMA for (( exp1; exp2; exp3 )); do COM function NAME { COMMANDS ; } or NA getopts optstring name [arg] hash [-lr] [-p pathname] [-dt] [na help [-s] [pattern ...] history [-c] [-d offset] [n] or hi if COMMANDS; then COMMANDS; [ elif jobs [-lnprs] [jobspec ...] or job kill [-s sigspec | -n signum | -si let arg [arg ...] local name[=value] ... logout popd [+N | -N] [-n] printf [-v var] format [arguments] pushd [dir | +N | -N] [-n] pwd [-LP] read [-ers] [-u fd] [-t timeout] [ readonly [-af] [name[=value] ...] return [n] select NAME [in WORDS ... ;] do CO set [--abefhkmnptuvxBCHP] [-o opti shift [n] shopt [-pqsu] [-o long-option] opt source filename [arguments] suspend [-f] test [expr] time [-p] PIPELINE times trap [-lp] [arg signal_spec ...] true type [-afptP] name [name ...] typeset [-afFirtx] [-p] name[=valu ulimit [-SHacdfilmnpqstuvx] [limit umask [-p] [-S] [mode] unalias [-a] name [name ...] unset [-f] [-v] [name ...] until COMMANDS; do COMMANDS; done variables - Some variable names an wait [n] while COMMANDS; do COMMANDS; done { COMMANDS ; }
まとめ
ユーザーが削除出来ない
については、コマンドで削除できるようになった。
ユーザーをグループから除外できない
については、グループの増減が自在にできないので難しそうだ。
とりあえずは、変更だけならユーザーを削除して登録し直せば良い。
しかし、新たな問題が発生した。
ユーザーを複数のグループに所属させることができない
不用意にユーザーを、削除して追加するようなプログラムにしたら、手動で登録したグルーピングが消えてしまう。
QNAPのお勉強はまだまだ続きそうです。
以上
何か御座いましたらコメント欄、またはTwitterからどうぞ♪
それではまた来週♪ ちゅんちゅん(・8・)