🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

2回答

2267閲覧

シェルで外部ファイルを読み込む際の書式チェックについて

pond

総合スコア350

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2021/03/04 11:40

前提・実現したいこと

ステージング環境サーバ上のシェルupdate.shで設定ファイル(list.txt:文字コードUTF-8)
を読み込んで、本番環境へWEBコンテンツをアップロード・削除する仕組みを作っています。
※構成図を参照ください

設定ファイルlist.txtは人が記述するので、記述の仕方が間違っていないかと、
文字コードのチェックをしたいのですが、シェルupdate.shでlist.txt読み込む際に
標準エラーで出力させて、ログで確認するしか方法はないでしょうか?

イメージ説明

該当のソースコード

list.txt

#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_ # # Ver.1.0.0  2021/03/03作成 # # Path: #  /home/opt/etc/list.txt # Description: #  /home/opt/bin/update.shで読み込む設定ファイル # #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_ TYPE = “update” TIMING = “schedule” FILE = “/var/www/html/example.html” TIME = “15:45 05/04/2021”

update.sh

#!/bin/bash #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_ # # Ver.1.0.0 2021/03/03作成 # # Path: #  /home/opt/bin/update.sh # Usage : #   CRONで1時間毎に定期実行する # Description : #   list.txtの各値を読み込み、値に元づき本番へコンテンツを #   アップロード、およびコンテンツを削除する # #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_ # ---------------------------------------------------------- # 事前処理 : list.txt読み込み # ---------------------------------------------------------- . ./list.txt # ---------------------------------------------------------- # メイン処理 : コンテンツのアップロード・削除 # ---------------------------------------------------------- if [$TYPE = update] && [$TIMMING = schedule]; then    echo “scp –r ${FILE} root@本番WEB#1: ${FILE} | at {$TIME}” elif [$TYPE = delete] && [$TIMMING = schedule] ; then  echo “ssh root@本番WEB#1 ‘-exec rm -rf {FILE} ;’ | at {$TIME}” elif [$TYPE = update] && [$TIMMING = immediate] ; then  scp –r ${FILE} root@本番WEB#1: ${FILE} elif [$TYPE = delete] && [$TIMMING = immediate] ; then  ssh root@本番WEB#1 ‘-exec rm -rf {FILE} ;’ else mv /home/opt/LIST_yyyymmdd.txt fi

補足情報(FW/ツールのバージョンなど)

サーバ:Amazon EC2
OS:Amazon Linux 2
シェル:bash

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takasima20

2021/03/04 13:02

やるなら、list.txt 書いた直後にチェックするツール? にかける方が運用しやすそうな気がします。
pond

2021/03/04 23:58

ありがとうございます。
退会済みユーザー

退会済みユーザー

2021/03/05 20:40 編集

bashの文法チェックなら、 $ bash -n list.txt で出来そうに思います。 文字コードについては、 $ iconv -f UTF-8 -t UTF-8 list.txt で出来そうに思います。 例えばこんな感じです。 $ cat list.txt HOGE="FUGA" print('こんにちは') $ bash -n list.txt list.txt: 行 2: 予期しないトークン `'こんにちは'' 周辺に構文エラーがあります list.txt: 行 2: `print('こんにちは')' $ echo $? 2 $ iconv -f UTF-8 -t CP932 list.txt >list.sjis.txt $ iconv -f UTF-8 -t UTF-8 list.sjis.txt HOGE="FUGA" print('iconv: 位置 19 に不正な入力シーケンスがあります $ echo $? 1 $
pond

2021/03/05 22:47

ありがとうございます。
pond

2021/03/05 22:51

大変勉強になります。
guest

回答2

0

. ./list.txtで読むのであれば、ファイルがシェルの文法に合ってない場合、エラーになります。

Bash

1. ./list.txt 2if [ $? != 0 ] 3then echo 文法エラー 4 exit 1 5fi

とか。

お書きのlist.txtも変数に代入する意図であれば文法に合ってない記述ですね。

エラーが無くても、必要な変数がセットされてないかも知れない。
rm *のような危険なコマンドが書いてあるかも知れない。

丁寧にやるには、何らかのツール(awkとかRubyとかPythonとか)で、文法をチェックして読み込めば良いのでは無いでしょうか。

投稿2021/03/04 11:56

otn

総合スコア85893

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pond

2021/03/04 23:57

ありがとうございます。
guest

0

ベストアンサー

受け取ってから弾くのではなく、こういうことがしたいのなら任意の内容のtxtをアップさせるのではなく、入力フォームを作ってそこでバリデーションをかけて想定外の値を入れさせないようにしたほうがいいと思います。
もっとも所詮フロントなのでそこだけで絞ってもやろうと思えば任意の値を埋め込むことはできちゃいますけどね…。

また、そもそもの話になりますが、このやり方だとlist.txtに任意のシェルコマンドを埋め込むことが可能なので危険です。
あと、本番サーバにrootでsshしているのも非常によくありません。sshでのrootログインは原則禁止しましょう。
上記を組み合わせると、本番サーバにroot権限で任意のコマンドが実行できてしまいます。
コマンドでなくても、例えば

bash

1TYPE = "delete" 2FILE = "/" 3TIMING = "immediate"

としただけで本番サーバを破壊できる気がするのですが…。
というわけなので、リスクが高すぎるので本番反映のやり方を見直すべきです。
(※そもそも文法が…という点は一旦度外視しています)

あと、コピペしたときに勝手に変換されたのかもしれませんが、記載の内容だとシングルクオートやダブルクオートが全角なのでどうやってもエラーになると思います。

stgのソースを本番にコピーするのはやめて、ソースをgit管理して何らかの方法でgitリポジトリの内容をデプロイする仕組みにしてはどうでしょうか。
方法はいくらでも出てくるので細かくは割愛しますが、内容によってはsshログインしてgit pull(※)でもいいですし、GitHubを使うならGitHub Actions(※)、AWSを使っているのでCodeDeploy等を使って自動化するもいいでしょう。
CircleCIみたいなサービスを使ってもいいですしね。
GitHubを使うのがダメでもAWSを使っているならCodeCommitが使えます。

※参考
gitでシンプルなデプロイ環境を作る
GitHub ActionsでEC2へのデプロイ自動化(CI/CD)
CodeDeploy のチュートリアル

投稿2021/03/05 02:47

yu_1985

総合スコア7588

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pond

2021/03/05 22:50

そうなんです。AWSCodeシリーズ、オープンソースのジョブ管理ツールも提案してみたのですが。。 いつもありがとうございます。
yu_1985

2021/03/06 11:52

どのみちこの構成は書いた通りのリスクがあるのでNGですね…。 最低限権限周りを見直してください。
pond

2021/03/09 01:01

ありがとうございます。そうですね。。。 見直しは多々必要そうです。。 このupdate.shだと、複数ファイルがと見込めませんし、 listもtxtでなく、jsonにしたほうが配列とオブジェクトをネスト構造で表現できるため どんなに複雑なデータ構造でも規定可能シンプルなので動きも軽いので、jsonに変更し jqコマンドで文字列を取りだす方法が良いのかと考え中です。
yu_1985

2021/03/09 03:25

txtをSCPで上げる、というやり方をする運用者がjsonをきちんと組み立てられますかね? あと、jsonにしたところで危険なコマンドが実行可能なことに変わりはないのでまずそっちをどうにかする必要があると思うのですが。 更に言うと、jsonにするくらいならyamlにすべきですね。 正直、まだstg経由のポートフォワードで本番アップロードさせたほうがマシだとすら思います。 こんなことするくらいなら例えばjenkinsサーバを1台立ててjenkinsにやらせるとかのほうが遥かに楽だと思うんですけど、この構成でないといけない理由があるんでしょうか?
pond

2021/03/09 06:46

そうですね。AWS Codeシリーズ・Jenkinsを使えば、上記が実現可能なんですよね? 色々ありがとうございます、こちらは一旦クローズさせて頂きます。
yu_1985

2021/03/09 06:56

上記とはどれを指していますか? 先の質問でも回答した内容とかぶりますが、根本的にデプロイの設計をやり直すべきと思うのでまず今の構成は忘れるべきと思います。 元となるソースがきちんと管理されてさえいれば、stgのファイルを本番コピーする必要はどこにもないかと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問