本記事は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・)