(ssh
経由で使用する必要があります。Ruby
ネットワーク/SSH) はフォルダを繰り返しコピーし、サブフォルダを除外します。私はこれを行う最速の方法を探しているので、rsync
いいえ。また、ssh
代わりにsh
。bash
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
そのまま実行されますが、一部の拡張は互換性のために無効になります。sh
bash
SSHサーバーは、で指定されているようにユーザーのログインシェルを起動します/etc/passwd
。シェルを変更するか、それを使用して必要に応じて他のシェルを起動できます。
答え3
まず、いくつかの注意:
- sshサーバーは
sh
クライアントから送信されたコマンドラインの解釈を開始せず、リモートホストでユーザーのログインシェルを実行しますthat-shell -c <the-string-provided-by-the-client>
。リモートユーザーのログインシェルは何でも可能です。一部のシェルではtcsh
。fish
rc
sh
- 実際にはコマンドラインまたはむしろ文字列です(改行文字を含めることができるので複数行あります)。
ssh host cmd arg1 'arg 2'
wherecmd
、arg1
およびarg 2
3 つのパラメータが に渡された場合でも、そのパラメータをssh
空白ssh
で連結し、実際にcmd arg1 arg 2
文字列を に送り、sshd
リモートシェルはこれを 、cmd
とarg1
に分割します。arg
2
!(subdir)
glob 演算子です (ksh
また、glob 演算子もサポートします)。すべてのglobと同様に隠しファイルを除外するので、他のファイルも除外できることに注意してください。zsh -o kshglob
bash -O extglob
ここでは、リモートシェルの正しい構文を見つける問題を回避するために、実際に他のシェルに必要なシェルを起動してstdinを介してコードを提供するように指示できます(inリモートユーザーのログインシェルを知らず、SSHを介して任意の単純なコマンドをどのように実行できますか?)
ssh host 'bash -O extglob -O dotglob' << 'EOF'
cp -r srcdir/!(subdir) dstdir/
EOF
bash -O extglob -O dotglob
Bourne などのシェル、csh、rc、fish... を含むすべての主要シェルで理解できるコマンドラインです。bash
ユーザーの$PATH
(デフォルト$PATH
、ユーザーが変更できる)ログインシェルにインストールされている限り、上記の操作は~/.zshenv
for zsh
、~/.cshrc
for csh
、~/.bashrc
forと同様に機能しますbash
。
POSIXly(実際にはbash
1つ以上のコマンドを持つシステムが多いことがわかりますが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>
また、arcfour
in(まだアクティブでない場合)で始まる行に暗号化を追加すると、許容できる速度が得られます。Ciphers
/etc/ssh/ssh_config
警告:arcfour
暗号化不安定。保護されていないチャネルを介してこのプログラムを実行しないでください。arcfour
セキュリティで保護されていないチャネルからサーバーにアクセスするために暗号化を使用することが心配な場合は、etc/ssh/ssh_config
以下を使用してください。ホスト別ソースホストのセクション - 上記のスイッチをミラーリングするために使用Host
できるソースホストのssh_configにセクションを作成します。これは暗号化をそのホストに限定します。Ciphers arcfour
-c
arcfour
詳細については、マニュアルページを参照してください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