- 投稿日:2020-08-30T23:48:15+09:00
NIC(eth0)のアドレス部分だけを取得する
ネットワークのアドレス
ifconfigでipを表示すると複数のNICのipが取得できます。
例えば下記のような感じです。
この中からifconfigでeth0のNICアドレスを取得するにはどうするのかを考えます。$ ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.28.99.150 netmask 255.255.240.0 broadcast 172.28.111.255 inet6 fe80::215:5dff:xxx:xxxx prefixlen 64 scopeid 0x20<link> ether 00:15:5d:90:90:41 txqueuelen 1000 (Ethernet) RX packets 742 bytes 149376 (149.3 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 16 bytes 1216 (1.2 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0eth0のアドレスをgrepする
ifconfigでgerpしてipアドレスだけを取得するには下記のようにします。
ifconfig eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'ifcongit eth0 で取得したいNICの情報を表示させます。
もし別のNICのIPアドレスが取得したければethXXといった感じでナンバーを指定します。
(これで通じるのだろうか。。。。)
その後パイプで結果を渡して正規表現でgrepしてます。
oはマッチしたとこだけ取るオプションでPはPerl形式の正規表現で、
この組み合わせで行の抽出と切り出しがマッチした部分のができますね。
- 投稿日:2020-08-30T22:29:09+09:00
Context Switch(コンテキストスイッチ)とは?
Context Switch(コンテキストスイッチ)とは?
コンテキストスイッチ (context switch) とは、複数のプロセスが1つのCPUを共有できるように、CPUの状態(コンテキスト (情報工学))を保存したり復元したりする過程のことである。コンテキストスイッチはマルチタスクオペレーティングシステムに不可欠な機能である。通常コンテキストスイッチは多くの計算機処理を必要とするため、オペレーティングシステムの設計においてはコンテキストスイッチを最適化することが重要である。
- マルチプロセスの環境でCPUがある一つのプロセスを実行している状態でインターラプトリクエストによる次の優先順位のプロセスが実行しなければならないとき、既存のプロセスの状態またはレジスタの値(Context)を保存してCPUが次のプロセスを行えるように新しいプロセスの状態またはレジスタ値(Context)を変える作業をContext Switch(Context Switching)といいます。
Context(コンテキスト)とは?
ユーザーと他のユーザー、ユーザーとシステムまたはデバイス間の相互作用に影響を受ける人、場所、オブジェクトなどの現在状況を規定する情報をいいます。
AndoroidやServletなのでもContextがあるが、OSでのContextはCPUが該当プロセスを実行するためのプロセス情報です。
このContextはプロセスのPCB(Process Control Block)に保存され、Context Switching時にPCBの情報を読み込んで(積載)CPUが前のプロセスがしていた作業を続けて行うことができます。
PCB(Process Control Block)の保存情報
プロセス状態
- 生成
- 準備
- 実行
- 待機
- 中止
プログラムカウンター
- プロセスが次に実行するアドレス
レジスタ
- アキュムレーター(累算器)
- スタック
- 索引レジスター
プロセス番号
ちなみにContext Switching時、該当CPUは何もできない。なので頻繁にContext Switchingを行われるとオーバーヘッドが発生し、効率(性能)が落ちます。
Context Switching - Interrupt
InterruptはCPUがプログラムを実行している時、実行中のプログラムの外から例外が発生し、処理が必要な場合
CPUに伝えて例外状況を処理できるようにすることをいいます。では、なんのInterruptリクエストが来たらContext Switchingが起きるでしょう?
- I/O リクエスト(入出力リクエスト)
- time slice expired (CPU使用時間の満了時)
- fork a child (子プロセスを作成時)
- wait for an interrupt (Interrupt処理を待っている時)その他にもあるで法けど、詳しいことは省略します。
- 投稿日:2020-08-30T21:20:27+09:00
Arch Linuxにデスクトップ環境を導入する(LightDM+Xfce4)
この記事では, Arch Linux にディスプレイマネージャ LightDM と デスクトップ環境 Xfce4 を導入します.
可能な限りシンプルな手続きでデスクトップ環境を起動することを方針とします.はじめに
ディスプレイマネージャとデスクトップ環境の一般的な話と, 今回導入する LightDM, Xfce4 について触れておきます.
ディスプレイマネージャ
ディスプレイマネージャは, グラフィカルなログイン画面を提供するアプリケーションです.
これを使わなくても, GUI環境にログインすることはできますが, ユーザ, デスクトップ環境の選択が直観的になります.
ディスプレイマネージャに関しては以下を参照のこと(他のディスプレイマネージャの候補の一覧も載っています):
https://wiki.archlinux.org/index.php/Display_managerこの記事では, ディスプレイマネージャとして LightDM をインストールします.
https://wiki.archlinux.jp/index.php/LightDMデスクトップ環境
Arch Linux はいくつかのデスクトップ環境をサポートしており, gnome や KDE plasma, xfce4 といった好みのデスクトップ環境を導入できます.
また, いくつかのディスプレイマネージャでは, 複数のデスクトップ環境をインストールするとログイン画面からインストールしたデスクトップ環境を選択することができ, 様々なデスクトップ環境を試すことができます.
サポートされるデスクトップ環境については以下を参照のこと(デスクトップ環境の比較もなされています):
https://wiki.archlinux.org/index.php/Desktop_environmentこの記事では, デスクトップ環境としてXfce4をインストールします.
https://wiki.archlinux.jp/index.php/Xfce前提となる環境
Arch Linux がインストールされており, ネットワーク接続の設定が完了していることを前提とします.
また, 一般ユーザの追加とsudo
が設定済みであることを前提とした表記をします.
root ユーザで設定しても構いませんが非推奨です.前回の記事 Arch Linux インストールガイド(UEFIデスクトップ編) - Qiita の続きと考えてもらっても構いません.
必要なパッケージのインストール
必要なパッケージをインストールします.
Arch Linux が提供する公式のパッケージのみで(すなわち,pacman
のみを使って)構築することができます.
個々のパッケージをインストールする前にシステムをアップデートしておきます。$ sudo pacman -SyuX11 のインストール
X11 をインストール:
$ sudo pacman -S xorg-server
xorg-server
がないと, Xfce4はもちろんのことLightDMすら起動することができません.
なお, デスクトップ環境がインストールされていなくても LightDMのインストールと起動まではできますが, ログインができません.LightDM のインストール
LightDM のインストール:
$ sudo pacman -S lightdm lightdm-gtk-greeterLightDM の起動には, greeter が必要になります.
greeter には, いくつかの選択肢がありますが, デフォルトではlightdm-gtk-greeter
が設定されており,
lightdm-gtk-greeter
をインストールしておけば, 特別な設定なしでLightDMが起動します.Xfce4 のインストール
Xfce4をインストールします.
公式がサポートするデスクトップ環境には,xfce4
の他に,gnome
,kde-plasma
,mate
,lxqt
などがあります.
他のデスクトップ環境をインストールする場合,xfce4
を好みのデスクトップ環境に変えてインストールしてください.$ sudo pacman -S xfce4LightDM サービスの起動
systemctl
を使って LightDM サービスを有効化します:$ sudo systemctl enable lightdm.service
.service
は省略可能です.有効化したら再起動します.
再起動後にLightDM が起動しグラフィカルなログイン画面が表示されます.
適当なユーザでログインすると, インストールした Xfce4 が起動されるはずです.
lightdm-gtk-greeter
を用いた場合, LightDM の右上にデスクトップ環境の選択メニューが表示されます.
複数のデスクトップ環境をインストールした場合は, ここでデスクトップ環境の選択が可能です.まとめ
LightDM を用いて, Arch Linux にグラフィカルなログイン画面とデスクトップ環境 Xfce4 を導入しました.
基本的には必要なパッケージをインストールし, LightDM のサービスを有効化するだけでGUI環境の導入が可能です.LightDM だけでなく,
gdm
,sddm
,lxdm
など各デスクトップ環境が提供するディスプレイマネージャに関しても同様の手続きで起動することができます.適当なディスプレイマネージャをインストール後にサービスを有効化することで再起動時にグラフィカルなログイン画面を起動することができます.LightDM の詳細な設定(greeter やテーマの設定, 仮想コンソールへのログインなど)に関しては, 別の機会に述べようと思います.
- 投稿日:2020-08-30T17:47:43+09:00
wslで.lnkの参照先フルパスを取得
- 投稿日:2020-08-30T15:08:27+09:00
【備忘録】覚えにくい用語
何回見ても、なんやったっけ?ていう用語を無理やり覚える方法
※個人的な覚え方で、解釈は適当です。touch【ファイルを作成する】
=>なぜ、ファイルを作成するのにmkfilとかでなくtouchなのか。
元々存在しないファイルは、触れない(touch)できない。ファイルを作成することにより、そのファイルに触れる(touch)できるようになる。mv【ファイル名を変更する】
=>パスは、コンピューターがファイルにアクセスする住所みたいなもの。
「東京/千代田区/1丁目/ハイツ リナックス」 というファイル(住所)があったとする。マンション名が「ハイツ リナックス」から 「マックマンション」 に変わったとする。
「東京/千代田区/1丁目/マックマンション」↑ コンピューターから見たら、ファイル名変更ではなく住所移動に見える。
【比較演算子が =< なのか <=なのか(順番)】
=> イコールが先だと 以上の時 => アロー演算子となってしまう。
だから、イコールが後。【asc と desc】
ascは A から始まっている。よって通常の並び⇨昇順
- 投稿日:2020-08-30T15:04:13+09:00
LinuxでNATルーター
概要
LinuxでNATルーターを構成し、2つのVLANの一方のアドレスをNATし通信させる方法です。
内容は検証目的のため、セキュリティ等一切考慮しておりません。本番運用の際にはご注意ください。想定シナリオ
以下の2つの組織が運用するVLANが存在するとします。
VLAN1: 192.168.1.0/24
VLAN2: 10.0.0.0/24ここで VLAN1 の 192.168.1.100 から VLAN2 の 10.0.0.100 にアクセスしたいとします。
VLAN1 側組織は10.0.0.0/24のアドレスが他の用途に利用されているとし、VLAN1側では10.0.0.100のアドレスは192.168.2.100に見えるようにします。
一方VLAN2側では、192.168.1.100 をアドレス変換なくアクセスできるようにします。設定手順
- CentOS 8 をインストールし、VLAN1とVLAN2に接続します。VLAN1をeth1とし、VLAN2をeth2とします。
- いろいろと面倒なので、SELinuxは無効化しておきます。
/etc/selinux/config
でSELINUX=disabled
にすればよいです。- また、firewalldも無効化しておきます。
systemctl disable firewalld
- ルーティング機能を有効化します。
/etc/sysctl.conf
にnet.ipv4.ip_forward=1
を追加してください。- 有効化するため、再起動します。
iptables
でNAT設定を行います。# iptables -t nat -A POSTROUTING -d 192.168.1.100 -j SNAT --to-source 192.168.2.100 # iptables -t nat -A PREROUTING -d 192.168.2.100 -j DNAT --to-destination 10.0.0.1001行目は、宛先が192.168.1.100のパケットを受信した場合に、ソースアドレスを192.168.2.100に変換。
2行目は、宛先が192.168.2.100のパケットを受信した場合に、宛先アドレスを10.0.0.100に変換。PREROUTINGを指定することで、宛先アドレスを変換した後にルーティングされるようにします。
この設定は再起動すると消えてしまうので、起動毎に実行してください。(永続化の方法がわかりませんでした)
- 投稿日:2020-08-30T09:53:16+09:00
プロセスを操るコマンド達 〜 プロセスの状態確認、優先度、バックグラウンド実行など
プロセスを操るコマンドを淡々と紹介します。
学習用、LPIC、LinuC対策などでご利用ください。
また、プロセスチーズのことだと思った人はブラウザバックを強く推奨します。
コマンド一覧
Linuxで動いているプログラムのことをプロセスという。
そんなプロセスを扱う以下のコマンドについて利用例と共に紹介する。(カッコで囲んでいるのはおまけ)
コマンド 説明 pgrep ユーザ名、UID、GIDなどを基に実行中のプロセスIDを検索する top 実行中のプロセスをリアルタイムで表示する ps プロセスの情報を取得する pstree 現在動作しているプロセスをツリー形式で表示する nice プロセスの優先度を変更する renice 動作中のプロセスの優先度を変更する jobs 実行中のプロセスを表示する bg バックグラウンドジョブにする fg フォアグラウンドジョブにする kill プロセスにシグナル信号を送る killall プロセスにシグナル信号を送る (free) システムの空きメモリと利用メモリの量を表示する pgrep
ユーザ名、UID、GIDなどを基に実行中のプロセスIDを検索するコマンド
$ pgrep -u root 1 2 3 4 6 ...(省略) $ pgrep -U 0 1 2 3 4 6 ...(省略)-uでユーザー名、-UでUIDを指定することができる
LINUXではrootのUIDは0
top
実行中のプロセスをリアルタイムで表示するコマンド
top - 22:06:29 up 1 day, 16:36, 1 user, load average: 0.00, 0.02, 0.00 Tasks: 96 total, 1 running, 55 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 1002108 total, 150664 free, 517700 used, 333744 buff/cache KiB Swap: 0 total, 0 free, 0 used. 330584 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 17870 mysql 20 0 1309152 319372 0 S 0.7 31.9 6:43.18 mysqld 32132 ubuntu 20 0 44524 3928 3320 R 0.3 0.4 0:00.01 top 1 root 20 0 159948 6360 3880 S 0.0 0.6 0:04.36 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gppsをオプションなしで実行すると、現在のシェルから起動したプロセスだけを表示する
自分の環境では遊びで立てていた mysqld や、今実行している top コマンドのプロセスも見ることができる
画面は自動で更新され、CPU使用率の高い順に表示されている
モニタリングは「q」を押すと終了する「PID」はプロセスID、「USER」はプロセスを実行したユーザー、「%CPU」はCPUを消費している割合、「%MEM」はメモリを消費している割合を意味している。
ps
PS(ProceSs)コマンドはプロセスの情報を取得するコマンド
$ ps PID TTY TIME CMD 31249 pts/0 00:00:00 bash 31348 pts/0 00:00:00 ps
オプションなしの実行をすると、その端末で起動したプロセスの一覧が表示される。
「PID」はプロセスID、「TTY」はプロセスを実行した端末名、「TIME」はプロセスの実行時間、「CMD」は実行コマンドを意味している。
結果より、シェルはbashを利用していることがわかる。
オプション 説明 a 他のユーザーのプロセスも表示する u ユーザー名も表示する x 端末から実行された物ではないプロセスも表示する e カーネル・プロセス以外のすべてのプロセスに関する情報を表示する f 完全なリストを生成する o 表示するカラムをカスタムする アクティブなプロセスを表示する
ps aux
$ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.6 159948 6268 ? Ss Aug27 0:04 /sbin/init root 2 0.0 0.0 0 0 ? S Aug27 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? I< Aug27 0:00 [rcu_gp] ...省略... ubuntu 31248 0.0 0.3 107980 3628 ? S 14:17 0:00 sshd: ubuntu@pts/0 ubuntu 31249 0.0 0.5 23112 5064 pts/0 Ss 14:17 0:00 -bash ubuntu 31351 0.0 0.3 40088 3504 pts/0 R+ 14:22 0:00 ps aux
ps -ef
という方法もある$ ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 Aug27 ? 00:00:04 /sbin/init root 2 0 0 Aug27 ? 00:00:00 [kthreadd] root 3 2 0 Aug27 ? 00:00:00 [rcu_gp] ...省略... ubuntu 31248 31155 0 14:17 ? 00:00:00 sshd: ubuntu@pts/0 ubuntu 31249 31248 0 14:17 pts/0 00:00:00 -bash ubuntu 31355 31249 0 14:27 pts/0 00:00:00 ps -ef表示を好きにカスタムしちゃうのもいいね
$ ps -o pid,nice,user,cmd PID NI USER CMD 3614 0 ubuntu -bash 4341 0 ubuntu ps -o pid,nice,user,cmdpstree
現在動作しているプロセスをツリー形式で表示するコマンド
以下はAWSのEC2で実行している例
$ pstree systemd─┬─accounts-daemon───2*[{accounts-daemon}] ├─acpid ├─2*[agetty] ├─amazon-ssm-agen───8*[{amazon-ssm-agen}] ├─atd ├─containerd───8*[{containerd}] ├─cron ├─dbus-daemon ├─dockerd───9*[{dockerd}] ├─lvmetad ├─lxcfs───10*[{lxcfs}] ├─mysqld───38*[{mysqld}] ├─networkd-dispat───{networkd-dispat} ├─polkitd───2*[{polkitd}] ├─rsyslogd───3*[{rsyslogd}] ├─snapd───8*[{snapd}] ├─sshd───sshd───sshd───bash───pstree ├─systemd───(sd-pam) ├─systemd-journal ├─systemd-logind ├─systemd-network ├─systemd-resolve ├─systemd-timesyn───{systemd-timesyn} ├─systemd-udevd └─unattended-upgr───{unattended-upgr}EC2にアクセスするために必要なsshdからbashが起動し、そのbashからpstreeが実行されているのがわかる
nice
プロセスの優先度を変更する
プロセスの優先度は、-20から19までで-20で定義されていて、低いほど優先度が高い
引数なしで実行すると、優先度は10足される
$ sleep 15 & [2] 2644 [1] Done nice sleep 15 $ ps -o pid,nice,user,cmd PID NI USER CMD 2521 0 ubuntu -bash 2644 0 ubuntu sleep 15 2645 0 ubuntu ps -o pid,nice,user,cmd $ nice sleep 15 & [1] 2634 $ ps -o pid,nice,user,cmd PID NI USER CMD 2521 0 ubuntu -bash 2634 10 ubuntu sleep 15 2635 0 ubuntu ps -o pid,nice,user,cmdrenice
実行中のプロセスの優先度を変更する
$ sleep 15 & [1] 2651 $ ps -o pid,nice,user,cmd PID NI USER CMD 2521 0 ubuntu -bash 2651 0 ubuntu sleep 15 2652 0 ubuntu ps -o pid,nice,user,cmd $ renice 10 2651 2651 (process ID) old priority 0, new priority 10 $ ps -o pid,nice,user,cmd PID NI USER CMD 2521 0 ubuntu -bash 2651 10 ubuntu sleep 15 2655 0 ubuntu ps -o pid,nice,user,cmdjobs
(バックグラウンド)実行中のジョブを表示する。
ジョブはユーザーから見た処理の単位のことで、ユーザーに見える形のフォアグラウンドジョブと見えない形のバックグラウンドジョブがある。
bgコマンドを前につけるか、実行コマンドの後ろに「&」をつけることで、バックグラウンドジョブにすることができる。$ sleep 60 & [1] 3810 $ jobs [1]+ Running sleep 60 & $ kill -s SIGKILL %1 $ jobs [1]+ Killed sleep 60
[1]
や%1
はジョブIDと呼ばれ、ユーザーごとに割り当てられる。bg
バックグラウンドジョブにする
実行中のプログラムで
Ctrl + z
を入力するか、
&
をつけて実行してもバックグラウンドジョブになる。fg
フォアグラウンドジョブにする
bashではフォアグラウンドジョブで動けるのは一つのプログラムだけである
kill
killコマンドを用いるとプロセスにシグナルという信号を送ることができる
シグナルID シグナル名 動作 1 SIGUP 端末の切断による終了 2 SIGINT 割り込みによる終了 9 SIGKILL 強制終了 15 SIGTERM 終了(デフォルト) 18 SIGCONT 再開 SIGTERMだとプログラムの終了処理が実行されるが、SIGKILLはそのまま強制終了される
ちなみに、「Control + c」で終了する時はSIGINTが送信されている
プロセスを終了する
プロセスIDが32147のプロセスを終了させたい時は以下のようにする
$ kill -15 32147シグナルIDを指定して終了することもできる
$ kill -s SIGTERM 32147プロセスを強制終了する
シグナルIDを指定して
$ kill -9 32147シグナル名を指定して
$ kill -s SIGKILL 32147※ SIGKILLなどは単にKILLとしてもコマンドは有効
killall
プロセス名を指定してプロセスにシグナル信号を送る
同じプログラムを複数実行してもプロセスごとに異なるPIDが割り当てられることになっているが、killallを用いると同じ名前のプロセスをまとめて終了できる
$ vi a.txt & [1] 3728 $ ps PID TTY TIME CMD 3614 pts/0 00:00:00 bash 3728 pts/0 00:00:00 vi 3732 pts/0 00:00:00 ps $ killall -15 vi $ ps PID TTY TIME CMD 3614 pts/0 00:00:00 bash 3728 pts/0 00:00:00 vi 3734 pts/0 00:00:00 ps $ killall -SIGKILL vi [1]+ Killed vi a.txt $ ps PID TTY TIME CMD 3614 pts/0 00:00:00 bash 3736 pts/0 00:00:00 psfree
システムの空きメモリと利用メモリの量を表示する
-t オプションと合わせると、物理メモリ、スワップメモリの合計を示す行も表示してくれる
$ free -t total used free shared buff/cache available Mem: 1002108 516296 104900 812 380912 331188 Swap: 0 0 0 Total: 1002108 516296 104900まとめ
プロセスに凝るだけで(少なくとも用語くらいは)カーネルのプログラムを知ることができます。
どのようなプログラムがパソコンで動いているか意識しながら楽しいLinux生活を送りましょう。一年ぶりのプロセスに関する話題でした。こっちもよろしくね。
- 投稿日:2020-08-30T07:34:19+09:00
Linux (ディレクトリ・パスについて)
ディレクトリについて、もう少し深く取り下げていきましょう。
簡易的ですが、ディレクトリツリーです。一番上は/(ルートディレクトリ)といいます。
ディレクトリの場所をコマンドで表記する場合に、パスという概念を覚えてください。
例えば、nekoディレクトリから見てimagesのパスは、/neko/date/imagesで表記される事なります。
homeディレクトリから見る場合は、/home/neko/date/imagesで表記されます。パスは経路と考えてください。nekoからimagesに行く経路・homeからimagesの行く経路。
イメージ先行で行きましょう。このファイルやディレクトリの経路を表すパスには2種類あります。
- 絶対パス
- 相対パス
上記の2種類です。絶対パスから紹介しましょう。
絶対パス
/(ルートディレクトリ)を基準にパスを表す方法です。
例えば、nekoの中のdateを表す場合は/home/neko/dateと表記します。説明だけしてもよく分からないですよね。
mkdirコマンドとcdコマンドを使って、実演しましょう。まずはmkdirコマンドで、ディレクトリを作成しましょう。
nekoのホームディレクトリ内で、neko-beyaを作成しましょう。[neko@localhost ~]$ mkdir neko-beya [neko@localhost ~]$ ls neko-beyaneko-beyaに移動しましょう。
cdコマンドを使用します。このコマンドはディレクトリの移動に使用します。絶対パスを指定して下さい。[neko@localhost ~]$ cd /home/neko/neko-beya [neko@localhost neko-beya]$~(チルダ)の部分が、neko-beyaに変わっていますか?
ちなみに、~はホームディレクトリを表しています。ログインして最初は、~になっています。
相対パス
ユーザが作業を行っているディレクトリを基準にパスを表記する方法です。
ユーザが作業を行っているディレクトリ=カレントディレクトリと言います。
覚えておいてください。知っている前提で書籍等でも解説される事があります。
例えば、カレントディレクトリがhome/nekoであるとしましょう。
neko-beyaを絶対パスで指定する時は、/home/neko/neko-beyaと表記します。
相対パスで指定する時は、neko-beyaで表記します。
カレントディレクトリがhomeである場合は、neko/neko-byaとなります。実演しましょう。
pwdコマンドを使うと、カレントディレクトリが分かります。[neko@localhost ~]$ pwd /home/neko/home/nekoがカレントディレクトリですね。neko-beyaに移動しましょう。
[neko@localhost ~]$ cd neko-beya [neko@localhost neko-beya]$いけましたか?
以上、
- mkdir
- cd
- pwd
ディレクトリ・パスについてでした。
- 投稿日:2020-08-30T00:37:32+09:00
linux のファイルを削除するのに、どんな権限が必要かを調査しました。
linux のファイル権限って難しいですね。
ファイルを削除するのに、どんな権限が必要かを調査しましたので、メモを残します。まず、使用する検証ツールを作る。
clear_folder.sh#!/usr/bin/env bash -Ceuo pipefail for ii in 640 641 642 643 644 645 646 647 do rm -rf ${ii} donecreate_folder.sh#!/usr/bin/env bash -Ceuo pipefail for ii in 640 641 642 643 644 645 646 647 do mkdir -m ${ii} ${ii} && cd ${ii} for kk in 640 641 642 643 644 645 646 647 do touch ${kk} chmod ${kk} ${kk} done cd .. donecheck-f.sh#!/usr/bin/env bash -Ceuo pipefail for ii in 640 641 642 643 644 645 646 647 do for kk in 640 641 642 643 644 645 646 647 do if [[ -f ${ii}/${kk} ]]; then echo ${ii}/${kk} fi done donecheck-rm-f.sh#!/usr/bin/env bash -Ceuo pipefail for ii in 640 641 642 643 644 645 646 647 do for kk in 640 641 642 643 644 645 646 647 do rm -f ${ii}/${kk} && echo ${ii}/${kk} done doneフォルダとファイルを作る(root)
id uid=0(root) gid=0(root) groups=0(root) sh create_folder.sh ls -al drwxrwxrwx. 10 root root 199 8月 30 00:00 . dr-xr-xr-x. 18 root root 235 8月 29 23:19 .. drw-r-----. 2 root root 94 8月 30 00:00 640 drw-r----x. 2 root root 94 8月 30 00:00 641 drw-r---w-. 2 root root 94 8月 30 00:00 642 drw-r---wx. 2 root root 94 8月 30 00:00 643 drw-r--r--. 2 root root 94 8月 30 00:00 644 drw-r--r-x. 2 root root 94 8月 30 00:00 645 drw-r--rw-. 2 root root 94 8月 30 00:00 646 drw-r--rwx. 2 root root 94 8月 30 00:00 647 find . -type f -ls 52669665 0 -rw-r----- 1 root root 0 8月 30 00:00 ./640/640 52669666 0 -rw-r----x 1 root root 0 8月 30 00:00 ./640/641 52669667 0 -rw-r---w- 1 root root 0 8月 30 00:00 ./640/642 52669669 0 -rw-r---wx 1 root root 0 8月 30 00:00 ./640/643 52669670 0 -rw-r--r-- 1 root root 0 8月 30 00:00 ./640/644 52669671 0 -rw-r--r-x 1 root root 0 8月 30 00:00 ./640/645 52669672 0 -rw-r--rw- 1 root root 0 8月 30 00:00 ./640/646 52669675 0 -rw-r--rwx 1 root root 0 8月 30 00:00 ./640/647 1273542 0 -rw-r----- 1 root root 0 8月 30 00:00 ./641/640 1273543 0 -rw-r----x 1 root root 0 8月 30 00:00 ./641/641 1273544 0 -rw-r---w- 1 root root 0 8月 30 00:00 ./641/642 1273545 0 -rw-r---wx 1 root root 0 8月 30 00:00 ./641/643 1273546 0 -rw-r--r-- 1 root root 0 8月 30 00:00 ./641/644 1273547 0 -rw-r--r-x 1 root root 0 8月 30 00:00 ./641/645 1273548 0 -rw-r--rw- 1 root root 0 8月 30 00:00 ./641/646 1273549 0 -rw-r--rwx 1 root root 0 8月 30 00:00 ./641/647 17935011 0 -rw-r----- 1 root root 0 8月 30 00:00 ./642/640 17935012 0 -rw-r----x 1 root root 0 8月 30 00:00 ./642/641 17935013 0 -rw-r---w- 1 root root 0 8月 30 00:00 ./642/642 17935014 0 -rw-r---wx 1 root root 0 8月 30 00:00 ./642/643 17935015 0 -rw-r--r-- 1 root root 0 8月 30 00:00 ./642/644 17935016 0 -rw-r--r-x 1 root root 0 8月 30 00:00 ./642/645 17935017 0 -rw-r--rw- 1 root root 0 8月 30 00:00 ./642/646 17935018 0 -rw-r--rwx 1 root root 0 8月 30 00:00 ./642/647 33755963 0 -rw-r----- 1 root root 0 8月 30 00:00 ./643/640 33755966 0 -rw-r----x 1 root root 0 8月 30 00:00 ./643/641 33755967 0 -rw-r---w- 1 root root 0 8月 30 00:00 ./643/642 33755968 0 -rw-r---wx 1 root root 0 8月 30 00:00 ./643/643 34138697 0 -rw-r--r-- 1 root root 0 8月 30 00:00 ./643/644 34138698 0 -rw-r--r-x 1 root root 0 8月 30 00:00 ./643/645 34138699 0 -rw-r--rw- 1 root root 0 8月 30 00:00 ./643/646 34138700 0 -rw-r--rwx 1 root root 0 8月 30 00:00 ./643/647 52669678 0 -rw-r----- 1 root root 0 8月 30 00:00 ./644/640 52669679 0 -rw-r----x 1 root root 0 8月 30 00:00 ./644/641 52669680 0 -rw-r---w- 1 root root 0 8月 30 00:00 ./644/642 52669681 0 -rw-r---wx 1 root root 0 8月 30 00:00 ./644/643 52669682 0 -rw-r--r-- 1 root root 0 8月 30 00:00 ./644/644 52669683 0 -rw-r--r-x 1 root root 0 8月 30 00:00 ./644/645 52669684 0 -rw-r--rw- 1 root root 0 8月 30 00:00 ./644/646 52669685 0 -rw-r--rwx 1 root root 0 8月 30 00:00 ./644/647 1273551 0 -rw-r----- 1 root root 0 8月 30 00:00 ./645/640 1273552 0 -rw-r----x 1 root root 0 8月 30 00:00 ./645/641 1273553 0 -rw-r---w- 1 root root 0 8月 30 00:00 ./645/642 1273554 0 -rw-r---wx 1 root root 0 8月 30 00:00 ./645/643 1273555 0 -rw-r--r-- 1 root root 0 8月 30 00:00 ./645/644 1273556 0 -rw-r--r-x 1 root root 0 8月 30 00:00 ./645/645 1273557 0 -rw-r--rw- 1 root root 0 8月 30 00:00 ./645/646 1273558 0 -rw-r--rwx 1 root root 0 8月 30 00:00 ./645/647 17935020 0 -rw-r----- 1 root root 0 8月 30 00:00 ./646/640 17935021 0 -rw-r----x 1 root root 0 8月 30 00:00 ./646/641 17935022 0 -rw-r---w- 1 root root 0 8月 30 00:00 ./646/642 17935023 0 -rw-r---wx 1 root root 0 8月 30 00:00 ./646/643 17935024 0 -rw-r--r-- 1 root root 0 8月 30 00:00 ./646/644 17935025 0 -rw-r--r-x 1 root root 0 8月 30 00:00 ./646/645 17935026 0 -rw-r--rw- 1 root root 0 8月 30 00:00 ./646/646 17935027 0 -rw-r--rwx 1 root root 0 8月 30 00:00 ./646/647 34670676 0 -rw-r----- 1 root root 0 8月 30 00:00 ./647/640 35401047 0 -rw-r----x 1 root root 0 8月 30 00:00 ./647/641 35401048 0 -rw-r---w- 1 root root 0 8月 30 00:00 ./647/642 35401051 0 -rw-r---wx 1 root root 0 8月 30 00:00 ./647/643 35401052 0 -rw-r--r-- 1 root root 0 8月 30 00:00 ./647/644 35401060 0 -rw-r--r-x 1 root root 0 8月 30 00:00 ./647/645 35401061 0 -rw-r--rw- 1 root root 0 8月 30 00:00 ./647/646 35401062 0 -rw-r--rwx 1 root root 0 8月 30 00:00 ./647/647sh でいつも使用するファイル存在チェック -f を検証(一般ユーザー)
id uid=1001(koryo) gid=1001(koryo) groups=1001(koryo) sh check-f.sh 641/640 641/641 641/642 641/643 641/644 641/645 641/646 641/647 643/640 643/641 643/642 643/643 643/644 643/645 643/646 643/647 645/640 645/641 645/642 645/643 645/644 645/645 645/646 645/647 647/640 647/641 647/642 647/643 647/644 647/645 647/646 647/647よく見ると、641、643、645、647 のフォルダの下のすべてのファイルが存在することになっています。
つまり:結論1:ファイルのフォルダに、x 権限さえあれば、ファイル存在チェックすることができる。たとえファイル自身に何も権限がなくても。
sh 内で rm を使ってファイルを削除するときはどうなる?(一般ユーザー)
id uid=1001(koryo) gid=1001(koryo) groups=1001(koryo) sh check-rm-f.sh rm: `640/640' を削除できません:許可がありません rm: `640/641' を削除できません:許可がありません rm: `640/642' を削除できません:許可がありません rm: `640/643' を削除できません:許可がありません rm: `640/644' を削除できません:許可がありません rm: `640/645' を削除できません:許可がありません rm: `640/646' を削除できません:許可がありません rm: `640/647' を削除できません:許可がありません rm: `641/640' を削除できません:許可がありません rm: `641/641' を削除できません:許可がありません rm: `641/642' を削除できません:許可がありません rm: `641/643' を削除できません:許可がありません rm: `641/644' を削除できません:許可がありません rm: `641/645' を削除できません:許可がありません rm: `641/646' を削除できません:許可がありません rm: `641/647' を削除できません:許可がありません rm: `642/640' を削除できません:許可がありません rm: `642/641' を削除できません:許可がありません rm: `642/642' を削除できません:許可がありません rm: `642/643' を削除できません:許可がありません rm: `642/644' を削除できません:許可がありません rm: `642/645' を削除できません:許可がありません rm: `642/646' を削除できません:許可がありません rm: `642/647' を削除できません:許可がありません 643/640 643/641 643/642 643/643 643/644 643/645 643/646 643/647 rm: `644/640' を削除できません:許可がありません rm: `644/641' を削除できません:許可がありません rm: `644/642' を削除できません:許可がありません rm: `644/643' を削除できません:許可がありません rm: `644/644' を削除できません:許可がありません rm: `644/645' を削除できません:許可がありません rm: `644/646' を削除できません:許可がありません rm: `644/647' を削除できません:許可がありません rm: `645/640' を削除できません:許可がありません rm: `645/641' を削除できません:許可がありません rm: `645/642' を削除できません:許可がありません rm: `645/643' を削除できません:許可がありません rm: `645/644' を削除できません:許可がありません rm: `645/645' を削除できません:許可がありません rm: `645/646' を削除できません:許可がありません rm: `645/647' を削除できません:許可がありません rm: `646/640' を削除できません:許可がありません rm: `646/641' を削除できません:許可がありません rm: `646/642' を削除できません:許可がありません rm: `646/643' を削除できません:許可がありません rm: `646/644' を削除できません:許可がありません rm: `646/645' を削除できません:許可がありません rm: `646/646' を削除できません:許可がありません rm: `646/647' を削除できません:許可がありません 647/640 647/641 647/642 647/643 647/644 647/645 647/646 647/647削除されたのは、以下のファイルたち:(643,647 の下すべてのファイル)
643/640,641,642,643,644,645,646,647
647/640,641,642,643,644,645,646,647結論2:ファイルのフォルダに、w 権限さえあれば、ファイルに権限がなくても削除することができる。
以上
- 投稿日:2020-08-30T00:15:55+09:00
pythonコマンドでpythonはpython3.8を指す
linuxでPythonコマンドを入力するとデフォルトで指すのは/usr/bin/python2.7です。
使いやすいのため、シンボリックリンクを作成して、pythonコマンドはpython3を指す。健忘症患者のメモ
#pythonのバージョンを表示 $ python -V Python 2.7 #元のシンボリックリンクを削除 $ sudo rm -rf /usr/bin/python #python関連ファイルを検索 $ whereis python python: /usr/bin/python /usr/bin/python2.7 /usr/bin/python3.6.5 /usr/bin/python3.8.5 #シンボリックリンクを作成 $ sudo ln -s /usr/bin/python3.8 /usr/bin/python #pythonのバージョンを表示 $ python -V Python 3.8.5pipも同じです~~