メールのマージSSHに「不明な名前またはサービス」が表示されます。

メールのマージSSHに「不明な名前またはサービス」が表示されます。

私は(他の興味深いものの中で)リモートホストで一連のコマンドを実行する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" を"usernamesum に分割しますhost"。解決策は、TEMPLATE =からそれへの参照を削除することです。

これは、ユーザー名にスペースが含まれているとスクリプトが機能しないことを意味します。しかし、これは許容可能なトレードオフです(この状況は他の多くの影響を与える可能性があるため)。

私はここで問題を創造的に解決することができたと思いますevalが、これが私の実装でどのように見えるかによって他の問題が発生しました。

おすすめ記事