比較する:

比較する:

ssh経由で使用する必要があります。Rubyネットワーク/SSH) はフォルダを繰り返しコピーし、サブフォルダを除外します。私はこれを行う最速の方法を探しているので、rsyncいいえ。また、ssh代わりにshbash

Bashでは、次のことを行います。

cp -r srcdir/!(subdir) dstdir

そしてそれは素晴らしい作品です。ただし、次のようにsshスクリプトを起動すると、

sh: 1: Syntax error: "(" unexpected

使用されているからですsh

マニュアルページを確認しましたが、shファイルを除外するオプションはありません。

sshこれがsh私が使用している正しい仮定ですか?代替案はありますか?

編集1: 動作している場合、出力はsudo cat /etc/shells次のようになります。

# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/usr/bin/tmux
/usr/bin/screen

編集2: わかりましたので、bashを使用できますが、これは問題ではないようです。実際にsshが使用されていることを確認しましたbash。この問題は、括弧や感嘆符のエスケープに関連しているようです。シェル(macos)でコマンドを実行してみましたが、実際のコマンドは次のとおりです。

ssh -i .ssh/key.pem [email protected] 'mkdir /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N; cp -r /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!\(constant\) /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N; ln -s /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/constant /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N/constant'

これにより他のエラーが発生します。

cp: cannot stat '/home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!(constant)': No such file or directory

編集3: コメントに基づいて追加のコマンドを変更しました。extglob

私が使うなら

ssh -i .ssh/key.pem [email protected] 'shopt -s extglob; mkdir /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N; cp -r /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!\(constant\) /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N; ln -s /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/constant /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N/constant'

次のエラーが発生します。

cp: cannot stat '/home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!(constant)': No such file or directory

かっこを抜けないと手に入る

bash: -c: line 0: syntax error near unexpected token `('

答え1

SSH は、リモートシステムが何であれ、リモートシステムでログインシェルを実行します。ただし!(foo)、必須であるため、shopt -s extglobリモコンに設定していない可能性があります。

SSHがリモート側でBashを実行していることを確認するには、次のようにします。

ssh me@somehost 'echo "$BASH_VERSION"'

印刷される項目があるが起動スクリプトが設定されていない場合は、extglob次に渡されるコマンドに基づいて手動で実行できますssh

ssh me@somehost 'shopt -s extglob
    echo srcdir/!(subdir)'                                 
 # or
ssh me@somehost $'shopt -s extglob\n echo srcdir/!(subdir)'   

extglobコマンドラインの解析に影響を与え、改行後にのみ適用されるため、リテラルの改行を入れる必要があり、セミコロンでは不十分です。

ssh me@somehost 'shopt -s extglob; echo srcdir /!(サブディレクトリ) '

同様に、バックスラッシュを使用して括弧をエスケープすると、他のグローバル文字と同様に特殊属性が失われます。この場合、あなたは望む仕事ではありません。

$ touch foo bar; shopt -s extglob; set +o histexpand
$ echo *
bar foo
$ echo !(foo)
bar
$ echo \*
*
$ echo !\(foo\)
!(foo)

答え2

なぜrsyncが遅いと思うのかわかりません。コピー速度は主にディスク速度に依存します。 Rsyncには、含める項目と除外する項目を指定するさまざまなオプションがあり、シェルワイルドカードよりも効果的に制御できます。

bashのマニュアルに記載されているように、bashは設定されるまで!(patter)これを認識しません。extglobあなたの場合、設定はありませんextglob。また、はbashそのまま実行されますが、一部の拡張は互換性のために無効になります。shbash

SSHサーバーは、で指定されているようにユーザーのログインシェルを起動します/etc/passwd。シェルを変更するか、それを使用して必要に応じて他のシェルを起動できます。

答え3

まず、いくつかの注意:

  • sshサーバーはshクライアントから送信されたコマンドラインの解釈を開始せず、リモートホストでユーザーのログインシェルを実行しますthat-shell -c <the-string-provided-by-the-client>。リモートユーザーのログインシェルは何でも可能です。一部のシェルではtcshfishrcsh
  • 実際にはコマンドラインまたはむしろ文字列です(改行文字を含めることができるので複数行あります)。ssh host cmd arg1 'arg 2'where cmdarg1およびarg 23 つのパラメータが に渡された場合でも、そのパラメータをssh空白sshで連結し、実際にcmd arg1 arg 2文字列を に送り、sshdリモートシェルはこれを 、cmdarg1に分割します。arg2
  • !(subdir)glob 演算子です (kshまた、glob 演算子もサポートします)。すべてのglobと同様に隠しファイルを除外するので、他のファイルも除外できることに注意してください。zsh -o kshglobbash -O extglob

ここでは、リモートシェルの正しい構文を見つける問題を回避するために、実際に他のシェルに必要なシェルを起動してstdinを介してコードを提供するように指示できます(inリモートユーザーのログインシェルを知らず、SSHを介して任意の単純なコマンドをどのように実行できますか?)

ssh host 'bash -O extglob -O dotglob' << 'EOF'
cp -r srcdir/!(subdir) dstdir/
EOF

bash -O extglob -O dotglobBourne などのシェル、csh、rc、fish... を含むすべての主要シェルで理解できるコマンドラインです。bashユーザーの$PATH(デフォルト$PATH、ユーザーが変更できる)ログインシェルにインストールされている限り、上記の操作は~/.zshenvfor zsh~/.cshrcfor csh~/.bashrcforと同様に機能しますbash

POSIXly(実際にはbash1つ以上のコマンドを持つシステムが多いことがわかりますがpax)、次のことができます。

ssh host sh << 'EOF'
cd srcdir && pax -rw -'s|^\.//\./subdir\(/.*\)\{0,1\}$||' .//. /path/to/destdir/
EOF

-s送信されるパスに代替を適用します。代替拡張子が空の場合、ファイルは除外されます。問題は、交換がシンボリックリンクターゲットでも機能することです。これが、私たちが.//.上記の方法を使用してシンボリックリンクが影響を受ける可能性を減らす理由です。

答え4

より速い方法でこれを行うには、rsync別の暗号化アルゴリズムを使用することをお勧めします。これにより、あまりにも多くの速度を犠牲にすることなく簡単に除外するオプションが提供されます。

rsync -aHAXxv --numeric-ids --progress -e "ssh -T -c arcfour -o Compression=no -x" user@<source>:<source_dir> <dest_dir>

また、arcfourin(まだアクティブでない場合)で始まる行に暗号化を追加すると、許容できる速度が得られます。Ciphers/etc/ssh/ssh_config

警告:arcfour暗号化不安定。保護されていないチャネルを介してこのプログラムを実行しないでください。arcfourセキュリティで保護されていないチャネルからサーバーにアクセスするために暗号化を使用することが心配な場合は、etc/ssh/ssh_config以下を使用してください。ホスト別ソースホストのセクション - 上記のスイッチをミラーリングするために使用Hostできるソースホストのssh_configにセクションを作成します。これは暗号化をそのホストに限定します。Ciphers arcfour-carcfour

詳細については、マニュアルページを参照してくださいssh_config

ただし、CPUがAES-NI命令セットをサポートしている場合は、次のように切り替えてみてください。[Eメール保護](はい、@エントリを含むパスワード名です。)非常に高速(AES-NIを使用)AES128-GCMを使用します。

したがって、CPUがAES-NIをサポートしている場合は、"ssh -T -c arcfour -o Compression=no -x"より安全な結果を得るためにAES-NIに変更してください。"ssh -T -c [email protected] -o Compression=no -x"

説明する

同期

  • (使用しないでください-z。速度がはるかに遅いです。)
  • a:アーカイブモード - 再帰、所有者の保存、権限の保存、変更時間の保存、グループの保存、シンボリックリンクをシンボリックリンクにコピー、デバイスファイルの保存。
  • H: ハードリンクを維持
  • A: ACL を維持
  • X:拡張属性を保持します。
  • x:ファイルシステムの境界を越えないでください。
  • v:ディテールのレベルを上げる
  • --numeric-ds:ユーザー/グループ名にuid / gid値をマップしません。
  • 同期が必要な場合は追加--delete:ターゲットディレクトリから無関係なファイルを削除する(同期中の違いのクリーンアップ)
  • --progress:転送中の進行状況を表示します。

SSH

  • T:ターゲットのCPU負荷を軽減するには、pseudo-ttyをオフにします。
  • c arcfour:最も弱いが最速のSSH暗号化を使用します。 「Ciphers arcfour」は、ターゲットのsshd_configで指定する必要があります。
  • o Compression=no:SSH圧縮をオフにします。
  • x:Xの転送がデフォルトでオンになっている場合はオフにしてください。

牛肉はオプションにあります。部品sshのみを使用している場合でも、この速度を得ることができます。rsync -av-e ssh -T -c arcfour -o Compression=no -x"


比較する:

  • 13.6MB/秒 rsync -az
  • 16.7MB/秒 scp -Cr
  • 44.8MB/秒 rsync -a
  • 59.8MB/秒 sftp
  • 61.2MB/秒 scp -r
  • 61.4MB/秒 sftp -R 128 -B 65536
  • 62.4MB/秒 rsync -a -P -e "ssh -T -c arcfour -o Compression=no -x"
  • 143.5MB/秒 scp -r -c arcfour
  • 144.2MB/秒 sftp -oCiphers=arcfour

源泉:

https://gist.github.com/KartikTalwar/4393116

http://nz2nz.blogspot.com/2018/05/rsync-scp-sftp-speed-test.html

関連情報