私は(他の興味深いものの中で)リモートホストで一連のコマンドを実行するbashスクリプトを書いていますが、sshコマンドは「不明な名前またはサービス」で失敗します。次のスクリプトは動作を再現します。
#!/bin/bash
function apply {
local cmd_template cmd_arg logfile
cmd_template=$1
cmd_arg=$2
logfile=$3
local cmd
cmd=${cmd_template//'{}'/${cmd_arg}}
echo "cmd is ${cmd}"
${cmd} >${logfile} 2>&1
}
USER="symcbean"
HOST="ssh.example.com"
SCRIPT="sleep"
TEMPLATE="ssh \"${USER}@${HOST}\" \"${SCRIPT}\" {}"
apply "${TEMPLATE}" "1" "/tmp/test.$$"
出力:
cmd is ssh "[email protected]" "sleep" 1
ssh: Could not resolve hostname ssh.example.com": Name or service not known
しかし、DNSは存在し動作します。また、出力からsshコマンドをコピーして貼り付けると、期待どおりに機能します。
私がここで何を見逃しているのでしょうか?
(誰かが提案する前に、私はxargsまたは並列処理を使用します。実際の実装ではここには存在しない動作が必要です。)
答え1
実際、手がかりはエラーメッセージにあります。
ssh: Could not resolve hostname ssh.example.com": Name or service not known
一致しない二重引用符に注意してください。
ssh は "username@host" を"username
sum に分割しますhost"
。解決策は、TEMPLATE =からそれへの参照を削除することです。
これは、ユーザー名にスペースが含まれているとスクリプトが機能しないことを意味します。しかし、これは許容可能なトレードオフです(この状況は他の多くの影響を与える可能性があるため)。
私はここで問題を創造的に解決することができたと思いますeval
が、これが私の実装でどのように見えるかによって他の問題が発生しました。