- 投稿日:2020-07-27T23:58:13+09:00
Linuxについて簡単まとめ
Linuxとは?
Unixをベースにして開発されたサーバーOSで、Windows Serverと並ぶ代表的なサーバーOSである。
Linuxはあくまでも総称であり、Linuxという名称のOSが存在するわけではない。
Linuxの特徴は?
主に以下の3つの特徴がある。
オープンソース(世間に公開されていて、誰でも自由に改変して配布できるソースコードのこと)であること。
フリーソフトウェアとして提供されている場合が多いこと。
Windows Serverの場合はMicrosoftの1社提供であるのに対して、Linuxはそれぞれのディストリビューションごとに提供者が存在し、各ディストリビューションごとに特徴がある。
例:Red Hat Enterprise Linux(提供者:Red Hat)→サーバー用に特化
:Debian GNU/Linux(提供者:Debian Project)→クライアントPC用とサーバー用どちらでも可
:Ubuntu(提供者:Canonical UK Ltd.)→クライアントPC用とサーバー用で別れているなぜLinuxは人気なのか?
理由は主に以下の3つがある。
1.使い始めてから廃止するまで費用を必要としない(無料で使える)
2.目的に合わせてOSを選択できる(ディストリビューションが豊富である)
3.サーバーソフトウェアが豊富(大抵のサーバーが構築可能である)
中には有料のLinuxも存在する
例:Red Hat Enterprise Linux
:SUSE Linux Enterprise Server
:Turbolinux
:Oracle Enterprise Linux
有料のLinuxを使う理由
有料だと提供元からのサポートが受けられるから
無料の場合はバグなどの障害が起きて開発コミュニティに問い合わせても対応してもらえるとは限らないから
- 投稿日:2020-07-27T23:11:10+09:00
linuxでvscodeの更新
linuxではvscodeの自動更新はないっぽい
macならできるのに。。。更新の方法がわからず使っていたら、Goのエクステンションがうまく動かなくなって、更新したら動作した事象を確認
amazon linuxを使用した場合のコマンドに関して記述
コマンド
ripository登録済みの場合は3つ目のコマンドからでOK
$ sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc $ sudo sh -c 'echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/vscode.repo' $ yum check-update $ sudo yum install code $ code .参考
- CentOS7 Visual Studio Code をインストール / アップデートする
- Visual Studio Code on Linux
- 投稿日:2020-07-27T23:00:18+09:00
gawk で NFに入る最大値を調べてみた。
きっかけ
以前、以下のようなファイルを、
sample.txt1 2 3 4 5 6 7 8 9以下のように3桁づつ改行を入れたくなるときがあり、
1 2 3 4 5 6 7 8 9以下のような、awkスクリプトを書きました。
{ for(i=1; i<=NF; i++) { printf "%d ", $i; if((i % 3) == 0) print ""; } }「あれ、これって入力ファイルがいくつまで対応できるのでしょう?」とふと思いました。
こんなファイルでも大丈夫なのかなと。。。sample.txt1 2 3 4 5 6 7 8 9 ... /* このあと大量に数字がつづく*/ .... 9999999999999999999調査(ドキュメント)
ドキュメントの NF の記載になにか書かれているかも。
https://www.gnu.org/software/gawk/manual/gawk.html#index-NF-variable
NF is a predefined variable whose value is the number of fields in the current record. awk automatically updates the value of NF each time it reads a record. No matter how many fields there are, the last field in a record can be represented by \$NF. So, \$NF is the same as \$7, which is ‘example.’. If you try to reference a field beyond the last one (such as $8 when the record has only seven fields), you get the empty string. (If used in a numeric operation, you get zero.)
「NFに入る最大値は・・・」みたいな記載を期待したが、特になし。
調査(ググる)
ここに、気になる記述が。
https://stackoverflow.com/questions/8857866/printing-long-integers-in-awk#comment11152277_8858003
Correct. According to info gawk: "The internal representation of all numbers, including integers, uses double-precision floating-point numbers. On most modern systems, these are in IEEE 754 standard format."
たしかに、ドキュメントにも記載がある。
https://www.gnu.org/software/gawk/manual/html_node/Scalar-Constants.html#DOCF30
ということで、最大どこまで?
ヒントになりそうなページがあった。
https://kumikomiya.com/mastering-float/
気が向いたら、もう少し調べる。
- 投稿日:2020-07-27T19:33:57+09:00
yps並走備忘録 Task1 EC2インスタンス作成~SSH接続~環境設定@Win環境
Twitterで無料で公開されているカリキュラムypsに今月より並走を開始しました。
備忘録がてら一通り書き残しておこうと思います。ちなみに自分の環境は少数であろうWin環境なので、マイナーが故に困った人の役に立てばと思います。
用語や理解は適当なので間違ってたら教えてくださいまし…事前準備
- Task0をまず読みルールを理解する
- amazon AWSのアカウント
- GitHubのアカウント(task3までは不要)推奨
- Linux標準教科書 *無料のPDF、Linuxコマンドで迷ったら読む
- TeraTerm *yotaro氏は推奨,個人的にはVS Code x コマンドプロンプトでもいいかもしれないと思います
Task1 クラウド環境の準備
事前にやること
- AWSのアカウント開設
- コマンドプロンプトをすぐ使えるようにしておく(自分はタスクバーに固定しています)Task1 手順
参考:https://github.com/yotaro-ok/yps/blob/master/task_1.md
Step1. EC2でCentOSインスタンスを作成(クラウドに仮想サーバーをセットアップ)
ザックリとした流れ
EC2 ⇒ インスタンス ⇒ インスタンス作成 ⇒ 無料枠のCentOS7選択 ⇒ 料金表を確認、t2.micro(無料枠)を選択 ⇒ ストレージを30GiBに変更 ⇒ インスタンスの作成&起動 ⇒ キーペアを作成 ⇒ インスタンスの表示ステップ詳細
1. AWSマネジメントコンソールで「EC2」を選択
2. 左側のメニューから「インスタンス」を選択
3. 青い「インスタンスの作成」ボタンを押す
4. 左側の「無料枠のみ」にチェックを入れ、「AWS Marketplace」をクリック
5. 上部の検索バーに「CentOS7」と入力してEnter
5. 無料枠終了後の料金表が出てくるので右下のContinueをクリック
6. インスタンスタイプの選択画面で上から2番目、「無料利用枠の対象」と緑色で表示されている「t2.micro」をにチェックを入れる
7. 右下の「次のステップ:インスタンス詳細の設定」をクリック
7. 詳細設定は特に設定するところなしなので、そのまま右下の「次のステップ:ストレージの追加」をクリック
8. 真ん中らへんにサイズ(GiB)と書いたボックスがあるので30と入力(※初期はおそらく8になってます)
9. 「次のステップ:タグの追加」をクリック
10. タグは特に追加しなくてもOKなので、追加しなければ「次のステップ:セキュリティグループの設定」をクリック
11. 「確認と作成」をクリック
12. 「起動」をクリックすると「既存のキーペアを選択するか、新しいキーペアを作成します。」と表示されるので、「新しいキーペアの作成」を選択、適当な名前をつけ、ダウンロードします(これのファイルが後ほどパスワードの代わりなります)
13. 請求が不安な方は「請求アラートの作成」からメールを設定しておけば無料枠を使い切りそうな時に通知が来ます。
14. 「インスタンスの表示」をクリック
15. インスタンスの状態が「running」になっていれば作成完了
(このウインドウは環境設定などでもそのまま使うので閉じずに残しておきましょう)Step.2 SSH接続(クラウドに作成したインスタンスに自分のパソコンから接続)
- ダウンロードした秘密鍵ファイル(.pemファイル)をデスクトップに移す
- 作成したインスタンスを選択し、IPv4パブリックIPと書いてあるものをコピー(※右側にコピーアイコンが出るので使うことを推奨)
- コマンドプロンプトを開いて下記3 ~ 5のコマンドを順番に打つ
mkdir .ssh
(解説:.sshという隠しフォルダを作成)copy Desktop\xxxx.pem .ssh
(解説:デスクトップの秘密鍵ファイルを先ほど作成した.sshファイルにコピー)ssh centos@xx.xx.xx.xx -i .ssh/xxx.pem
(解説: centosユーザーとしてxx.xx.xx.xxのIPアドレスにssh接続 -i の後ろの秘密鍵ファイルを使いますよ)whoami
と打ってcentosと表示されれば接続完了Step.3 環境設定(色々いじれるようにしていく&悪意のある接続がされないように設定変更)
上記SSHで接続した状態で以下のコマンドを入力してSELinuxを無効化し、設定をいじれるようにする
sudo setenforce 0
(解説:sudoは管理者権限を利用できるようにするコマンド、SELinuxを一時的に無効化)sudo vi /etc/selinux/config
(解説:SELinuxのファイルを編集)- 画面に表示された中から 「SELINUX = enforcing」と書いてあるところを見つけて「SELINUX=disabled」に変更
- *iキーで編集モード、wqで保存して終了
getenforce
と打ってPermissiveと返ってくれば一先ずOK- AWSのマネジメントコンソール画面に戻って右下のセキュリティグループと書いてある横の「CentOs 7」から始まる青文字のリンクをクリック
- 下の方にある「インバウンドルール」をクリックして、「インバウンドルールを編集」ボタンをクリック
- 左側にある「ルールを追加」をクリック
- タイプは「カスタムTCP」を選択
- ポート範囲に「49152~65536内の任意の番号」を入力(ポート≒サーバーに入るためのドア番号)
- ソースは「カスタム」ですぐ横の虫眼鏡のところに0.0.0.0/0を入力
- 右下の「ルールを保存」をクリック
- コマンドプロンプトで下記のコマンドを入力
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org
(解説: sshd_configの元のファイルをsshd_config.orgというファイル名でバックアップ)sudo vi /etc/ssh/sshd_config
(解説: sshd_configファイルを編集して、サーバーコンピューターのアクセス周りの設定をする)- sshd_config ファイル変更点(ルートユーザーのログインを禁止して、自分で設定したポートからしか入れないようにする操作)
- 「#Port 22」と書いてあるところの22という数字を10.で設定したポート番号へ変更(#はコメントアウトの意なので外す)
- 「#PermitRootLogin Yes」と書いてあるところを「PermitRootLogin No」へ変更(#はコメントアウトの意なので外す)
- i で編集モードを終了し、:wqで変更を保存してターミナルへ戻る 15. 変更が正しいかを確認
sudo sshd -t
と打って何も表示されなければ設定はOKsudo systemctl restart sshd
でサーバーを再起動して設定を反映する- 以下のコマンドを打ってスワップ領域(サーバーのメインメモリ足りなくなった際に使うsshdの領域)を作成
sudo -s /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
sudo -s /sbin/mkswap /var/swap.1
sudo -s /sbin/swapon /var/swap.1
Step.4 環境設定完了の確認
- ログインしているターミナル画面で
exit
と打って、一度ログアウト- コマンドプロンプトで下記のコマンドを打ってログインできるか確認
ssh -p xxxxxx(設定したポート番号) centos@xx.xx.xx.xx(EC2のIPアドレス) -i .ssh/xxx(秘密鍵のファイル名).pem
- ログインできていればポートの設定は問題なくできているので
- AWSのマネジメントコンソールへ戻り
- インバウンドルールの編集から 6.SSH (ポート22)を削除、ルールを保存
なお、インスタンスが1つ以上稼働しているとAWSは課金されるので、使用しているインスタンス以外は停止もしくは終了させること
ここまでできたら一先ずクラウドにサーバーができたのでTask1終了
- 投稿日:2020-07-27T16:07:06+09:00
Linuxでコア電圧を読む
タイトルの通りのことをするのにCLI環境で楽に実行できる方法を調べたのでメモ
必要
- intel CPU Sandy Bridge 以降
- intel以外のことは調べてないので不明
- msr-tools
- apt-get とかでインストールできる
- msrドライバ
/dev/cpu/*/msr
が存在しない場合はmodprobe msr
でロードする読む
生値
sudo rdmsr 0x198 -u --bitfield 47:32電圧[V]に変換
awk "BEGIN { print $(sudo rdmsr 0x198 -u --bitfield 47:32)/8192 }"
bc
でもいいけど、awk
のほうが確実にインストールされている気がする。繰り返し読む
watch -n 1 'awk "BEGIN { print $(sudo rdmsr 0x198 -u --bitfield 47:32)/8192 }"'やってること
CPUのMSR (Model Specific Register) レジスタのアドレス0x198は
MSR_PERF_STATUS
という名前で、コア電圧がビット[47:32]に格納されている。これをrdmsr
コマンドで読み出し、読み出しやすいように変換する。取説によると、
P-state core voltage can be computed by MSR_PERF_STATUS[37:32] * (float) 1/(2^13).
とのことなので、読みだした値を8192で割ってる。(↑[37:32]になってるけど多分誤植)
- 取説 : Intel 64 and IA-32 Architectures Software Developer’s Manual
ただし、このレジスタの[47:32]ビットの定義があるのはSandy Bridgeのテーブル2-20だけで、他の世代については記載がない。取説によるとMSR_hogeは世代ごとに定義されるものなので、上書きされる可能性はある。現に、Core世代(core2duoとかの)では、ビット[46,44:40]はそれぞれ別の定義が存在する。
これについてSandy Bridge以降の世代のCPUで読んだ場合に値が保証されるのか調べたものの、解釈が割れておりよくわからなかった。ただし、上書き定義も無い。手持ちのKaby Lakeではそれっぽい値が読めてる。
もっと確実な方法があったら教えて下さい。
- 投稿日:2020-07-27T13:11:38+09:00
cd - 作業ディレクトリを移動 - Linuxコマンド
cdコマンド
cdコマンドは、現在の作業ディレクトリ(フォルダ)を移動するコマンドです。
書式
cd [オプション] [ディレクトリ]オプション
オプション 説明 -P 指定したディレクトリがシンボリックリンクの場合、シンボリックリンクのターゲットに移動 -L 指定したディレクトリがシンボリックリンクの場合、シンボリックリンクに移動 ショートカット
cdコマンドには、記号を利用したショートカットが利用できる。
ショートカット 説明 / ルートディレクトリを表す . 現在のディレクトリを表す .. 親ディレクトリを表す ~/ ホームディレクトリを表す 使用例
cdコマンドは、ディレクトリを指定せずに実行するとホームディレクトリに移動する。
作業ディレクトリ/tmp/で、ディレクトリを指定せずにcdコマンドを実行すると、ユーザーのホームディレクトリ(/home/user_name)へ移動する。$ pwd /tmp $ cd $ pwd /home/user_nameオプション-Lを利用して、シンボリックリンクディレクトリへ移動する。
$ cd -L tmp_dir $ pwd /home/user_name/tmp_dirオプション-Pを利用して、シンボリックリンクのターゲットへ移動
$ pwd /home/user_name $ ls -l lrwxrwxrwx 1 user_name user_name 5 May 23 14:20 tmp_dir -> /tmp/ $ cd -P tmp_dir user_name@www31205ue:/tmp$ pwd
- 投稿日:2020-07-27T08:10:52+09:00
シェルスクリプト ファイルの存在で条件分岐
- 投稿日:2020-07-27T07:47:56+09:00
秘密鍵を10億個作れば、高確率で自分の名前を含む公開鍵が作れる件
エンジニアなら誰もがgithubで晒される公開鍵。
https://github.com/ユーザー名.keys
で全世界に公開されます。それでは、稚拙ながら私@umihicoの公開鍵をご覧ください。
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFUMIHICoCb3Sy2n1qPXOxc2mFBqW9Hg0dRigxl2F3nW
そうです。自身のユーザー名を挿入することに成功しました。正規表現で指定の文字列が見つかるまで、とにかく鍵を生成し続けるワンライナーを作り、それを1週間くらい回しました。ワンライナーはこちらです。
@Ress さんより
cd $(mktemp -d)
を使用しディスクIOの時間を減らすアドバイスを頂きました。ありがとうございます!cd $(mktemp -d); while true; do seq 1000 | xargs -P 1000 -I NUM sh -c 'ssh-keygen -t ed25519 -f NUM.pem -N "" -C "" > /dev/null && if grep -vi umihico NUM.pem.pub > /dev/null; then rm NUM.pem NUM.pem.pub;fi' ; if find . -mindepth 1 | read; then for f in *.pem.pub; do echo $f >> files.txt; done; test -f files.txt && head -n1 files.txt | xargs -I F echo found; break; fi ; date ; done鍵生成から正規表現判定と削除までの処理を、
xargs
でマルチプロセスを使って1000個の並列処理をしています。見つかり次第、while
から抜けています。RSAよりed25519を使うことで短時間で大量に作成できます。しかも鍵の安全性が高まり、文字長も短いです。サーバーでtmuxなどを使ってバックグラウンドで処理させる場合は通知がほしいので、
echo found
を例えばSlackのWebhook Incoming APIなどに置換しましょう。以下のようになります。cd $(mktemp -d); while true; do seq 1000 | xargs -P 1000 -I NUM sh -c 'ssh-keygen -t ed25519 -f NUM.pem -N "" -C "" > /dev/null && if grep -vi umihico NUM.pem.pub > /dev/null; then rm NUM.pem NUM.pem.pub;fi' ; if find . -mindepth 1 | read; then for f in *.pem.pub; do echo $f >> files.txt; done; test -f files.txt && head -n1 files.txt | xargs -I F curl -s -X POST -d '{"text":"F"}' https://hooks.slack.com/services/XXXXXXXXX/YYYYYYYYYYY/zzzZZZzZzzZzzZZzz; break; fi ; date ; doneちなみに遊休サーバーなら使ってもいいかというと、EC2はCPUバーストの設定によっては+αの課金をされるので注意しましょう。
CPUバーストUnlimitedのEC2さんに乱暴したら課金されたそれでは希望の文字列が発生する確率と待ち時間について考察します。
7文字のbase64からなるランダムな文字列が、偶然umihico
(case-insensitive)になる可能性は、2^7/64^7
です。そしてed25519は変化する文字列長が43文字なので、7文字の場合はこの試行を37回同時に行えると解釈できます。つまり1回でヒットする確率は0.0000001076841726899147%
です。>>> 2**7/64**7*37 1.076841726899147e-0910億回試行するまでに見つかる確率は10億回連続で見つからない確率を1から引けばよいです。65.9%です。
>>> 1-(1-2**7/64**7*37)**(10**9) 0.6593302436744479X文字をYの確率で出現させるにはZ回試行すればよい、というのは以下の式で得られます。(python3.6以降のターミナル)
>>> import math >>> X=8 >>> Y=0.6 >>> Z=int(math.log(1-Y,1-2**X/64**X*(43-X+1))) >>> f"{X}文字の場合{ '{:,}'.format(Z)}回で{Y*100}%" '8文字の場合27,985,342,058回で60.0%'ワンライナーは1000件生成が完了する毎に
date
が実行されるので、少し眺めていれば1日に何件試行できるか見当がつきます。1秒に1000件できても、8文字で60%を叩き出す270億回のためには324日かかるので、8文字以上の名前の方々は現実的ではないと言えそうです。ごめんなさい。そして注意点があります、公開鍵は当然、ランダムな文字列ではありません。しかし名前という
任意な文字列を含む確率
という命題に対しては、ランダムとして扱えると仮定しています。色々試し、体感的には正しそうですが、無根拠です。つまり、永遠に試行しても発生しない文字列や、ランダムより歪んだ確率を持つ文字列の存在が十分ありえます。この辺をもっと調べたいですが、これ以上業務時間を使うべきではありません。@angel_p_57 さんよりコメントで補足を頂きました。
ランダムとして扱ってよいが、最初のIの次は大文字A~Pに限られるとのことです。ありがとうございます。ご一読ありがとうございました。
参考
- https://qiita.com/suthio/items/2760e4cff0e185fe2db9
- https://qiita.com/wnoguchi/items/a72a042bb8159c35d056
- https://qiita.com/ir-yk/items/af8550fea92b5c5f7fca
- https://jnst.hateblo.jp/entry/2014/12/15/200542
- https://www.slideshare.net/hnw/edomaesec-20150124
- https://hnw.hatenablog.com/entry/20140705
- https://qiita.com/YuukiMiyoshi/items/e428c7d89d713f642638
- 投稿日:2020-07-27T05:23:39+09:00
パスワード付きPDFのパスワードがわからなくなった?pdfcrackならなんとかしてくれるかも?
Note: 悪用は禁物なコマンドです。
以前頂いたPDFがパスワード付きになっていたが、パスワードがどうしても思い出せない。多分、数字4桁だったのだが…という機会があり、pdfcrackを使ったら瞬殺でパスワードを見つけてくれました。
pdfcrack -f hoge.pdf -n 4 -m 4 -c0123456789
-n
: minimum password length
-m
: maximum password length
-c
: char set参考
http://manpages.ubuntu.com/manpages/trusty/man1/pdfcrack.1.html
- 投稿日:2020-07-27T05:23:39+09:00
パスワード付きPDFのパスワードがわからなくなった?pdfcrackならなんとかしてくれるかも
Note: 悪用は禁物なコマンドです。
以前頂いたPDFがパスワード付きになっていたが、パスワードがどうしても思い出せない。多分、数字4桁だったのだが…という機会があり、pdfcrackを使ったら瞬殺でパスワードを見つけてくれました。
pdfcrack -f hoge.pdf -n 4 -m 4 -c0123456789
-n
: minimum password length
-m
: maximum password length
-c
: char set参考
http://manpages.ubuntu.com/manpages/trusty/man1/pdfcrack.1.html