コマンドをファイルに保存し、別のファイルから読み取ろうとします。コマンドはパイプなしでうまく機能しますが、コマンドにパイプがある限り実行されません。
誰でも私を助けることができますか?
スクリプト
#!/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:コマンドを変数に入れようとしていますが、複雑な場合は常に失敗します!
解決策:この場合、危険な方法で乱用される可能性があるため、バグマグネットという評判は悪くなりますeval
。eval
デフォルトでは、その目的はシェル構文やコマンドなどのデータを実行することです。これは、実行可能コードと怠惰なデータ(ファイル名など)の境界が通常よりも弱いことを意味します。ただし、この場合、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
最終リダイレクト後に追加してください。