dak ブログ

python、rubyなどのプログラミング、MySQL、サーバーの設定などの備忘録。レゴの写真も。

curl でクエリ文字列を URL エンコードして HTTP リクエストを送信

2021-10-20 21:40:59 | linux
curl でクエリ文字列を URL エンコードして HTTP リクエストを送信する方法のメモ。

curl でクエリ文字列を URL エンコードするには以下のように --data-urlencode {パラメータ}={値} の形式でパラメータを指定します。
curl 'http://search.goo.ne.jp/web.jsp' \
  -v \
  --get \
  --url-urlencode 'IE=UTF-8' \
  --url-urlencode 'OE=UTF-8' \
  --url-urlencode 'MT=検索'

上記を実行すると -v オプションを指定しているため、リクエストヘッダが表示されますが、
URL は以下のように URL エンコードされています。
GET /web.jsp?IE=UTF-8&OE=UTF-8&MT=%E6%A4%9C%E7%B4%A2 HTTP/2


次に、単純に URL に MT=検索 を指定して HTTP リクエストを送信してみます。
curl -v 'http://search.goo.ne.jp/web.jsp?IE=UTF-8&OE=UTF-8&MT=検索

リクエストされた URL には「検索」がそのまま含まれていることがわかります。
GET /web.jsp?IE=UTF-8&OE=UTF-8&MT=検索 HTTP/2


apache 2.4系でのアクセス制限

2021-09-30 20:11:11 | linux
apache 2.4系でのアクセス制限の設定方法のメモ。

以下のようにして、特定の複数のIPからのみアクセスを許可する設定をしてみました。
<RequireAll>
  Require all granted
  <RequireAny>
    Require ip xx.xx.xx.xx
    Require ip yy.yy.yy.yy
    Require ip zz.zz.zz.zz
  </RequireAny>
<RequireAll>


apache のリバースプロキシの設定

2021-09-30 19:55:46 | linux
apache 2.4系のリバースプロキシの設定のメモ。

/foo/ へのリクエストを同一サーバの 9000 番ポートの /bar/ にアクセスするように以下の設定を行いました。
ProxyPass /foo/ http://localhost:9000/bar/
ProxyPassReverse /foo/ http://localhost:9000/bar/

しかし、apache の設定だけでは、http://localhost:9000/bar/ にはリクエストが送信されず、
エラーログに client denied by server configuration が出力されます。
httpd.conf での設定以外に apache の他サーバへの接続許可の設定を行う必要があります。
sudo setsebool -P httpd_can_network_connect on

設定を確認するには getsebool を使います。
sudo getsebool httpd_can_network_connect


linux の chrome で html を pdf に変換する方法のメモ

2021-09-21 21:14:17 | linux
linux の chrome で html を pdf に変換する方法のメモ

■chrome のインストール
/etc/yum.repos.d/google.chrome.repo を作成します。
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub

安定版をインストールします。
sudo yum install google-chrome-stable

■chrome で html を pdf に変換
--print-to-pdf オプションを指定すると、html を pdf に変換することができます。
google-chrome \
    --disable-gpu \
    --headless \
    --print-to-pdf={pdf_file} \
    {url}

以下は、https://www.goo.ne.jp/ を pdf にする例です。
google-chrome \
    --disable-gpu \
    --headless \
    --print-to-pdf=www_goo_ne_jp.pdf \
    'https://www.goo.ne.jp'


CentOSのインストール後の設定

2021-09-09 23:13:28 | linux
CentOSのインストール後の設定に関するメモ。

■日本語の locale のインストール
sudo yum install glibc-langpack-ja

■日本語の設定
settings から Regin & Language を選択し、以下を設定
Language: 日本語
Formats: 日本語
input sources: 日本語

画像形式の判定方法

2021-02-06 13:15:10 | linux
画像形式をデータから判定する方法のメモ。

画像ファイルの形式は、画像データの先頭のバイト列のマジックナンバーをチェックすることで判定することができます。
画像 URL の拡張子と画像データの形式が一致しない場合でも、画像データの先頭をチェックすることで、画像形式の判定を行うことができます。

jpg: 先頭が 0xff 0xd8
png: 先頭が 0x89 0x50(P) 0x43(N) 0x47(G)
gif: 先頭が 0x47(G) 0x49(I) 0x46(F)

ちなみに、gzip の場合は先頭が 0x1f 0x8b となります。

例えば、perl の場合には以下のようにして判定を行うことができます。
   if ($obj =~ /^\xff\xd8/) {
        print("jpg\n");
    }
    elsif ($obj =~ /^\x89\x50\x43\x47/) {
        print("png\n");
    }
    elsif ($obj =~ /^\x47\x49\x46/) {
        print("gif\n");
    }
    elsif ($obj =~ /^\x1f\x8b/) {
        print("gzip\n");
    }
    else {
        print("other\n");
    }


awk で tsv の特定カラムの文字列を置換する方法

2020-07-23 14:53:21 | linux
awk で tsv の特定カラムの文字列を置換する方法のメモ。

以下の tsv ファイルの第3カラムの a を A に置換します。
$ cat test.tsv
1       a       1a
1       b       1b
1       c       1c
2       a       2a
2       b       2b
2       c       2c

$ cat test.tsv | awk -F "\t" '{OFS="\t"; gsub(/a/, "A", $3); print $1, $2, $3}'
1       a       1A
1       b       1b
1       c       1c
2       a       2A
2       b       2b
2       c       2c


awk で tsv の特定カラムが正規表現でマッチする行を抽出する方法

2020-07-23 14:41:57 | linux
awk で tsv の特定カラムが正規表現でマッチする行を抽出する方法のメモ。

tsv の第3カラムが正規表現にマッチする行を抽出する場合、以下のようにします。
$ cat text.tsv
1       a       1a
1       b       1b
1       c       1c
2       a       2a
2       b       2b
2       c       2c

$ cat text.tsv | awk -F "\t" '$3 ~ /a/ {OFS="\t"; print}'
1       a       1a
2       a       2a



grep の出力結果をバッファリングしない方法

2020-02-05 22:42:41 | linux
grep の出力結果をバッファリングしない方法のメモ。
grep --line-buffered

で、grep の結果がバッファリングされなくなります。

tail -f でシステムのログなどをリアルタイムに確認する際、特定の文字列に該当する行を
grep で単純にフィルタリングすると、条件に合致してもバッファリングされて
しばらく出力されない場合があります。

しかし、--line-buffered によって、バッファリングされずに行単位で出力されるようになります。

curl で BASIC 認証のID・パスワードを指定する方法

2019-12-21 15:26:52 | linux
curl で BASIC 認証のID・パスワードを指定する方法。
curl --basic -u {id}:{パスワード} URL


digest 認証の場合には、--digest を指定します。
curl --digest -u {id}:{パスワード} URL


その他のオプション。
-s:         プログレスメーター、エラーメッセージを非表示。
-v:         デバッグ情報を表示
-o:         出力先のファイルを指定
--insecure: SSL証明を無視


grepでマッチした前後の行を表示する方法

2019-11-02 22:01:48 | linux
grepでマッチした前後の行を表示する方法のメモ

-A {行数} を指定すると、パターンにマッチした行から指定行数分の行も出力します。
"A" は after の A です。

-B {行数} を指定すると、パターンにマッチした行より前の指定行数分の行も出力します。
"B" は before の B です。

$ wget -O - 'https://news.goo.ne.jp/' | grep -A 1 -B 1 スタート
<li><a href="https://www.goo.ne.jp/sitemap/">サイトマップ</a></li>
<li><a href="https://www.goo.ne.jp/set/">スタートページに設定</a></li>
<li><a href="https://www.goo.ne.jp/rss/">RSS</a></li>


boost のインストールメモ

2019-04-13 22:53:45 | linux
boost をインストールした際のメモ。

■事前準備
python の include ディレクトリにリンクを貼っておく
cd ~/.pyenv/versions/3.6.5/include
ln -s python3.6m python3.6


■インストール
gtar zxvf boost_1_70_0.tar.gz
cd boost_1_70_0
./bootstrap.sh --with-python-root=~/.pyenv/versions/3.6.5
./b2
./b2 install --prefix=~/local/boost



cmake でインストール先を指定する方法

2019-04-13 20:32:18 | linux
cmake でインストール先を指定する方法のメモ。

インストールしたいモジュールを展開したディレクトリで以下を実行。
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=インストール先のディレクトリ
make install


インストール先のディレクトリとして /home/xxx/localを指定すると、
/home/xxx/local/{bin,lib,include}などにインストールされます。


apache のモジュールを確認する方法

2019-02-23 16:01:45 | linux
apache のモジュールを確認する方法のメモ。

■静的モジュール
httpd -l
$ httpd -l
Compiled in modules:
  core.c
  prefork.c
  http_core.c
  mod_so.c


■読込済みの静的・動的モジュール
httpd -M
$ httpd -M
Syntax OK
Loaded Modules:
 core_module (static)
 mpm_prefork_module (static)
 http_module (static)
 so_module (static)
 auth_basic_module (shared)
 auth_digest_module (shared)
 authn_file_module (shared)
 authn_alias_module (shared)
 


プロセスが利用しているポートを調べる方法

2019-02-11 12:38:26 | linux
プロセスが利用しているポートを調べる方法のメモ
$ sudo netstat -anp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 127.0.0.1:41207             0.0.0.0:*                   LISTEN      32524/Passenger Rub
tcp        0      0 0.0.0.0:25                  0.0.0.0:*                   LISTEN      4479/smtpd
...


-a: 接続待ち状態/接続待ちではないソケットも表示
-n: ホスト・ポート・ユーザーなどを数字で表示
-p: PID/Program name を表示(rootで実行する必要がある)