ファイルからコマンドを読む

ファイルからコマンドを読む

コマンドをファイルに保存し、別のファイルから読み取ろうとします。コマンドはパイプなしでうまく機能しますが、コマンドにパイプがある限り実行されません。

誰でも私を助けることができますか?

スクリプト

#!/bin/bash
rm -f /ZLD_Implement/ZLD_Implement.txt
while IFS=#, read -r Command_info1 Command; do
     variable1=$Commandenter code here
echo "$Command_info1" >> /ZLD_Implement/ZLD_Implement.txt
echo "`$variable1`"  >> /ZLD_Implement/ZLD_Implement.txt
done < /ZLD_Implement/ZLD_Command_list.txt

コマンドリスト:

[root@localhost ZLD_Implement]# cat ZLD_Command_list.txt
Command to check the hostname # hostname
Command to check the linux kernel version # uname -a
Command to check the current system date # dateer code here
Command to check Disk space # df -kh
Command to cheeck routes in Netstat # netstat -nrv
command to check audit logs # ausearch -i -m USER_CHAUTHTOK,USER_MGMT,USER_AUTH` -if /var/log/audit/audit.log|tail -50nter code here

ベストアンサー1

シェルは変数を拡張する前にパイプを解析(およびリダイレクト、引用、エスケープなど)するため、パイプ(またはリダイレクトまたは...)を変数に入れると、拡張時にすでに遅すぎます。正常に実行されると、コマンドの一般的な引数にすぎません。バラよりBashFAQ#50:コマンドを変数に入れようとしていますが、複雑な場合は常に失敗します!

解決策:この場合、危険な方法で乱用される可能性があるため、バグマグネットという評判は悪くなりますevalevalデフォルトでは、その目的はシェル構文やコマンドなどのデータを実行することです。これは、実行可能コードと怠惰なデータ(ファイル名など)の境界が通常よりも弱いことを意味します。ただし、この場合、ZLD_Command_list.txtから読み取ったデータは次のようになります。すべきシェル構文とコマンドとして扱われます。rm -R /ファイルに1つがある場合は、次のようになります。しなければならないファイルシステム全体を削除します。

ただし、まだ正しい引用符に従う必要があります。これは変数に二重引用符を意味します(逆引用符の代わりにeval "$variable1"使用eval $variable1することをお勧めします)。$()バッシュFAQ #82echo)、しかし結果だけが欲しいので、コマンドを実行しないのはなぜですか?

$Command他の可能な最適化:値をにコピーせずに$variable1直接使用してください。各コマンドの出力を個別にリダイレクトするのではなく、ループ全体の出力をリダイレクトしないのはなぜですか?

上記のすべてが修正された私のバージョンは次のとおりです。

#!/bin/bash
while IFS=#, read -r Command_info1 Command; do
    echo "$Command_info1"
    eval "$Command"
done < /ZLD_Implement/ZLD_Command_list.txt > /ZLD_Implement/ZLD_Implement.txt

ああ、標準出力だけでなく、コマンドのエラー出力もキャプチャしたいですか?その場合は、2>&1最終リダイレクト後に追加してください。

おすすめ記事