シェルスクリプトをバイナリ化する「shc」
シェルスクリプトをバイナリ化する「shc」の紹介です。
1.はじめに
シェルスクリプト(bash等)はテキスト形式のプログラムのため、スキルのある人が読めば、その内容が解読されてしまいます。
ですが、shc(Shell Script Compiler)を利用すれば、スクリプトがバイナリ化されるので、解読される心配がなくなります。
たとえば、他のサーバにログインする際、知られたくないユーザーやパスワードの記述が可能です。
2.インストール
yumコマンド等でもインストールできるようですが、ここではパッケージをダウンロードしてビルドする手順で説明します。
shcのパッケージは下記のURLよりダウンロードします。
https://neurobin.org/projects/softwares/unix/shc/
Linux環境にアップロードし、ダウンロードしたアーカイブを展開します。
展開するとshc-releaseディレクトリができるので、そのディレクトリに移動し、
# ./configure
# make
# make install
を実施します。
コマンドの実行結果は下記です。
# ./configure
./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking whether gcc understands -c and -o together... yes
checking whether make supports the include directive... yes (GNU style)
checking dependency style of gcc... gcc3
checking how to run the C preprocessor... gcc -E
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking fcntl.h usability... yes
checking fcntl.h presence... yes
checking for fcntl.h... yes
checking for stdlib.h... (cached) yes
checking for string.h... (cached) yes
checking for unistd.h... (cached) yes
checking for struct stat.st_rdev... yes
checking for stdlib.h... (cached) yes
checking for GNU libc compatible malloc... yes
checking whether time.h and sys/time.h may both be included... yes
checking for sys/time.h... yes
checking for unistd.h... (cached) yes
checking for alarm... yes
checking for working mktime... yes
checking for stdlib.h... (cached) yes
checking for GNU libc compatible realloc... yes
checking for memset... yes
checking for putenv... yes
checking for strchr... yes
checking for strdup... yes
checking for strrchr... yes
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: executing depfiles commands
# make
Making all in src
make[1]: ディレクトリ `/home/hoge/shc/shc-release/src' に入ります
gcc -DPACKAGE_NAME=\"shc\" -DPACKAGE_TARNAME=\"shc\" -DPACKAGE_VERSION=\"4.0.3\" -DPACKAGE_STRING=\"shc\ 4.0.3\" -DPACKAGE_BUGREPORT=\"http://github.com/neurobin/shc/issues\" -DPACKAGE_URL=\"\" -DPACKAGE=\"shc\" -DVERSION=\"4.0.3\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FCNTL_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STRUCT_STAT_ST_RDEV=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DTIME_WITH_SYS_TIME=1 -DHAVE_SYS_TIME_H=1 -DHAVE_UNISTD_H=1 -DHAVE_ALARM=1 -DHAVE_STDLIB_H=1 -DHAVE_REALLOC=1 -DHAVE_MEMSET=1 -DHAVE_PUTENV=1 -DHAVE_STRCHR=1 -DHAVE_STRDUP=1 -DHAVE_STRRCHR=1 -I. -g -O2 -MT shc.o -MD -MP -MF .deps/shc.Tpo -c -o shc.o shc.c
mv -f .deps/shc.Tpo .deps/shc.Po
gcc -g -O2 -o shc shc.o
make[1]: ディレクトリ `/home/hoge/shc/shc-release/src' から出ます
make[1]: ディレクトリ `/home/hoge/shc/shc-release' に入ります
make[1]: `all-am' に対して行うべき事はありません.
make[1]: ディレクトリ `/home/hoge/shc/shc-release' から出ます
# make install
Making install in src
make[1]: ディレクトリ `/home/hoge/shc/shc-release/src' に入ります
make[2]: ディレクトリ `/home/hoge/shc/shc-release/src' に入ります
/bin/mkdir -p '/usr/local/bin'
/usr/bin/install -c shc '/usr/local/bin'
make[2]: `install-data-am' に対して行うべき事はありません.
make[2]: ディレクトリ `/home/hoge/shc/shc-release/src' から出ます
make[1]: ディレクトリ `/home/hoge/shc/shc-release/src' から出ます
make[1]: ディレクトリ `/home/hoge/shc/shc-release' に入ります
make[2]: ディレクトリ `/home/hoge/shc/shc-release' に入ります
make[2]: `install-exec-am' に対して行うべき事はありません.
/bin/mkdir -p '/usr/local/share/man/man1'
/usr/bin/install -c -m 644 shc.1 '/usr/local/share/man/man1'
make[2]: ディレクトリ `/home/hoge/shc/shc-release' から出ます
make[1]: ディレクトリ `/home/hoge/shc/shc-release' から出ます
インストールするとshcコマンドが有効になります。
# shc
shc parse(-f): No source file specified
shc Usage: shc [-e date] [-m addr] [-i iopt] [-x cmnd] [-l lopt] [-o outfile] [-rvDSUHCABh] -f script
3.使い方
簡単なサンプルで説明します。
下記の内容を「sample.sh」で保存します。
#!/bin/bash
echo "OK"
このスクリプトをバイナリ化するには、下記のように実行します。
shc -f sample.sh -o sample.sh.x
"-f"にシェルスクリプトを指定し、"-o"に出力ファイルを指定します。
実行すると下記の2つのファイルが生成されます。スクリプトとして使用するのは、sample.sh.xの方です。
- sample.sh.x.c:C形式のファイル
- sample.sh.x:バイナリ化されたファイル
拡張子は".sh.x"でなくても問題ないようです。
パラメータは他にも色々あるので、manコマンドで調べて下さい。
4.注意事項
バイナリ化したファイルを他のサーバで再利用したい場合、必ず"-r"オプションをつけてください。
shc -f sample.sh -o sample.sh.x
"-r"オプションを付与せず他のサーバで実行しても正常に動作しません。
請求書の表記変更について
販売させて頂いているプラグインについて、請求書や見積書を提示させて頂くことがよくあるのですが、最近、CSVDataImExporterプラグイン(MT6→MT7バージョンアップ)の請求書の記載内容について修正を依頼される企業様がいらっしゃいましたので、その経緯を備忘録として残しておきます。
ちなみに、当方では「ZOHO INVOICE」というオンラインサービスを利用させて頂いており、デフォルトのフォーマットで対応させて頂いてます。
1.1回目の修正依頼内容
- 請求日:6月の日付に変更
- 支払期限:7月末に変更
- 利用開始日:7月1日に変更
このあたりの修正は時々行っており、これで作業が終了するのですが、追加で2回目の修正依頼がきました。
2.2回目の依頼内容
- 価格表記:税抜き価格・消費税金額・税込み価格など項目名の詳細明記の依頼(案を提示したところ、ご要望にそぐわなかったようで3回目で記載内容が提示されました)
- 利用開始日:月日のみのため、年月日の表記に修正依頼
- 詳細欄の「差額」の表記を具体的に記載の依頼
- 「総額」「残額」という表記が分かりづらいため「請求金額」に修正依頼
ちなみに「利用開始日」は、1回目の依頼でご要望通りに修正したはずですが、お詫びの言葉もなく、追加の修正を依頼されました。
私が逆の立場であれば、相手の心情を察して「修正して頂いたところ大変申し訳ありませんが」の一言は添えると思います。
そして、修正した請求書にまだご納得頂けないようで、3回目の依頼が届きました。
3.3回目の依頼内容
- 「ご請求金額 ¥xx,xxx(税込)」を追加してフォントを大きく表示してほしい(うーん…という感じです)
- 「残額」欄の削除
- 「支払い条件」欄の削除
- 内訳の追記(下記、価格部分を除き原文のまま)
MT7版
※現在利用中の以下「MT6カスタムフィールド対応版」との差額が請求額となります。
<内訳>
○MT6カスタムフィールド対応版(現在ご利用分):
\xx,xxx-(税抜き価格)
※1行空き
○MT7版(今回ご購入分):
\xx,xxx-(税抜き価格)
※1行空き
上記、MT6カスタムフィールド対応版とMT7版との差額=請求金額:
\xx,xxx-(税抜き価格)
この段階で、まだ修正依頼がありそうと予感し、フォントの拡大等、当方で利用しているサービスのフォーマットが受け入れられないようなので、Excel等での請求書フォーマットの提示を要望したのですが、
「弊社は請求システムから生成された請求書を使用しており、Excelフォーマットの形ではご用意できない状況です」
という返答がかえってきました。
そういうことではなく、お互いに効率よく作業を進められる方法のご提案だったのですが。
あと、こちらも「請求システムから生成された請求書」を使用しているのですが。
また、なぜここまで記載の変更・修正を要望されているのか確認したところ、
「監査上、第3者が見て分かりやすい表記内容を求められるため、商取引における一般的な請求書内容を踏まえ、ご相談させていただいた次第です」
との回答でした。
私が利用しているZOHO INVOICEのデフォルトフォーマットは「一般的な請求書内容」ではないようです。申し訳ありません。
なお、一部対応できないことをお伝えしたところ、4回目の依頼がきました。
4.4回目の依頼内容
- 「総額」を「請求金額」に変更
- 「残額」欄の削除(2回目)
- 「支払い条件」欄の記載変更
ここまでの依頼について修正し、ようやく納得頂けました。
5.総括
やりとりの経緯は以上です。
私の利用している請求書の、いわゆるフォーマットが一般的でないかもしれないことについては申し訳なく思います。
ただ、相当数のライセンス販売で、請求書の記載内容の修正依頼がきたのはこれが初めてで、1度にまとめての依頼であればまだしも、度重なる修正依頼は相当のプレッシャーで、正直、精神的にかなり疲れてしまいました。
そして、この企業様以外の多くの企業様・事業主様は、当方の提示する請求書等を快く受領して頂き、本当に感謝しております。ありがとうございます。
今後も引き続きよろしくお願い致します。
MySQLのrootログインで「Access denied for user 'root'@'localhost' (using password: YES)」に遭遇した場合の対処
MySQLのrootログインで「Access denied for user 'root'@'localhost' (using password: YES)」に遭遇した場合の対処方法を紹介します。
1.問題点
MySQLをインストールし、mysqldサービスを起動し、mysqladminコマンドでrootログインをしようとしたところ、下記のエラーに遭遇しました。
# mysqladmin -u root password -p
Enter password:
mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'root'@'localhost' (using password: YES)'
ちなみにrootの初期パスワードは、
/var/log/mysqld.log
2023-08-26T06:33:00.897137Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: :Vqw<Poh0:gY
の行末に記録されています。
ただ、今回はこのパスワードを設定しても上記のエラーに遭遇しました。
2.対処
手順は下記の通りです。
- /etc/my.cnf または /etc/mysql/my.cnf を任意のエディタで開く
- "[mysqld]"の下に「skip-grant-tables under」を追加
- mysqldを再起動
- 「mysql -u root -p」を実行し、パスワードを聞かれても入力せずにリターン(これでログインできる)
- プロンプトが「mysql>」になったら「flush privileges;」を入力(権限の反映)
- 「ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';」を実行(NewPasswordには新しいパスワードを設定)
- quitでmysqlを終了し、再度「mysql -u root -p」を実行。先ほどのパスワードでログインできることを確認
- OKであれば、my.cnfに追加した設定「skip-grant-tables under」を削除
- mysqldを再起動
3.参考サイト
参考サイトは下記です。ありがとうございました。