#!/bin/bash
sourcenode=$1
destnode=$2
path1=/root/test
ssh root@"${sourcenode}" -t "echo "${path1}" | xargs -IDIR find DIR " |
while read line
do
ssh root@"${sourcenode}" -t "stat -c "%a" $line | xargs -IDIR ssh root@"${destnode}" chmod DIR $line"
done
このスクリプトは、2つのリモートコンピュータ(ソースとターゲット)間の権限のみをコピーする必要があります。ソースコンピュータとターゲットコンピュータには、少数の/root/test/
ファイルを含むフォルダ()があります。何らかの理由で、最初の行は\r
最後に追加された内容を読みます。私はそれを取り除くためにいくつかの方法を試しましたが、役に立ちませんでした。
このエラーが発生します。
Pseudo-terminal will not be allocated because stdin is not a terminal.
stat: cannot stat `/root/test\r': No such file or directory
答え1
ああ、ループと役に立たないxargsを持つトリプルSSHパイプ、あなたはこれまでに見つけた最悪のアプローチを持っています。
あなたが\r
見るのはパイプを通る改行文字の残りの部分のようです。このオプションを削除する必要があります-t
。これが問題の原因である可能性があります。仮想端末に表示される出力は、通常のストリームとは異なります。
また、echo ${path1} | xargs
完全に冗長であるため、実行中にfind ${path1}
入力ワイヤは1つしかありませんxargs
。 2番目のものも同じですxargs
。もちろんすべてを入れることができますfind
。努力する:
ssh root@"${sourcenode}" "find ${path1} -printf 'chmod %m \"f\"\n'"
そしてそれを次のコマンドに入力します(いいえローカルbashループに入りますが、sshはターゲットノードに直接接続されます)。