Saya perlu menjalankan skrip jarak jauh menggunakan ssh
via Ruby
( net / ssh ) untuk menyalin folder secara rekursif dan mengecualikan subfolder. Saya mencari cara tercepat untuk melakukannya sehingga rsync
tidak baik. Juga, saya mengerti bahwa ssh
menggunakan sh
dan tidak bash
.
Dalam bash saya lakukan:
cp -r srcdir/!(subdir) dstdir
dan itu bekerja dengan baik. Namun ketika saya meluncurkan skrip melalui ssh
saya menerima kesalahan
sh: 1: Syntax error: "(" unexpected
karena menggunakan sh
.
Saya telah memeriksa sh
halaman manual, tetapi tidak ada opsi untuk mengecualikan file.
Apakah asumsi saya ssh
menggunakan yang sh
benar? Ada saran alternatif?
EDIT 1:
Dalam hal ini berguna, output dari sudo cat /etc/shells
adalah sebagai berikut:
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/usr/bin/tmux
/usr/bin/screen
EDIT 2:
Oke. Jadi bash itu tersedia dan sepertinya tidak menjadi masalah. Saya telah memverifikasi bahwa ssh sebenarnya menggunakan bash
. Masalah ini tampaknya terkait dengan keluarnya tanda kurung atau tanda seru. Saya telah mencoba menjalankan perintah dari shell (macos) dan ini adalah perintah yang sebenarnya:
ssh -i .ssh/key.pem ubuntu@X.X.X.X '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'
Dengan cara ini saya menerima kesalahan yang berbeda
cp: cannot stat '/home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!(constant)': No such file or directory
EDIT 3:
Berdasarkan komentar saya telah mengubah perintah saya menambahkanextglob
Jika saya gunakan
ssh -i .ssh/key.pem ubuntu@X.X.X.X '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'
Saya menerima kesalahan berikut:
cp: cannot stat '/home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!(constant)': No such file or directory
Jika saya tidak lepas kurung saya dapatkan
bash: -c: line 0: syntax error near unexpected token `('
ssh
(wellsshd
) menggunakan shell login dari pengguna jarak jauh. Bisa apa saja.Jawaban:
SSH menjalankan shell login Anda pada sistem jarak jauh, apa pun itu. Tetapi
!(foo)
membutuhkanshopt -s extglob
, yang Anda mungkin tidak mengatur pada remote.Coba ini untuk melihat apakah SSH menjalankan Bash di sisi jarak jauh:
Jika itu mencetak apa pun, tetapi skrip startup Anda tidak disetel
extglob
, Anda dapat melakukannya dengan tangan pada perintah yang diteruskan kessh
:extglob
mempengaruhi penguraian baris perintah, dan hanya berlaku setelah baris baru, jadi kita harus meletakkan baris baru literal di sana, tanda titik koma tidak cukup.Juga bukan bahwa jika Anda lolos dari kurung dengan garis miring terbalik, mereka kehilangan sifat khusus mereka, seperti karakter gumpal lainnya. Ini bukan yang ingin Anda lakukan dalam kasus ini.
sumber
Saya tidak tahu mengapa Anda berpikir bahwa rsync akan lambat. Kecepatan salinan sebagian besar ditentukan oleh kecepatan disk. Rsync memiliki banyak opsi untuk menentukan apa yang ingin Anda sertakan dan singkirkan, sehingga memberi Anda kontrol yang jauh lebih baik daripada shell globbing.
Seperti yang dinyatakan dalam manual bash,
!(patter)
ini hanya dikenali dalam bash jikaextglob
disetel. Dalam contoh Anda, Anda tidak menetapkanextglob
. Lebih lanjut,bash
dimulai sepertish
masihbash
, tetapi akan menonaktifkan beberapa ekstensi untuk kompatibilitas.Server SSH akan memulai shell login pengguna, seperti yang ditentukan dalam
/etc/passwd
. Anda dapat mengganti shell, atau menggunakan shell itu untuk memulai shell lain yang lebih sesuai dengan kebutuhan Anda.sumber
time
.time cp -r mesh/!(constant) N
-> 1.04s nyata dantime rsync -a mesh/ N --exclude=constant
-> 1.8s nyataBeberapa catatan pertama:
sh
menafsirkan baris perintah yang dikirim oleh klien, ia menjalankan shell login pengguna pada host jarak jauh, sepertithat-shell -c <the-string-provided-by-the-client>
. Shell login pengguna jarak jauh bisa berupa apa saja. Ingatlah bahwa beberapa kerang sukatcsh
,fish
ataurc
memiliki sintaks yang sangat berbeda dari itush
.ssh host cmd arg1 'arg 2'
di manacmd
,arg1
danarg 2
tiga argumen dilewatkan kessh
,ssh
merangkai argumen-argumen dengan ruang dan benar-benar mengirimkancmd arg1 arg 2
string untuksshd
, dan remote shell akan dibagi ke dalamcmd
,arg1
,arg
dan2
.!(subdir)
adalah operator glob (ksh
operator glob juga didukung olehzsh -o kshglob
danbash -O extglob
). Seperti semua gumpalan, itu mengecualikan file tersembunyi, jadi waspadalah mungkin ada file lain yang dikecualikan.Di sini, untuk menghindari masalah dengan mencari sintaks yang tepat untuk shell jarak jauh, Anda dapat benar-benar memberi tahu shell lain untuk memulai shell yang Anda inginkan dan mengumpankannya kode melalui stdin (salah satu opsi yang tercantum di Cara menjalankan sederhana sewenang-wenang perintah lebih dari ssh tanpa mengetahui shell login dari pengguna jarak jauh? )
bash -O extglob -O dotglob
adalah baris perintah yang dipahami sama oleh semua shell utama, termasuk yang mirip Bourne, csh, rc, fish ... Di atas akan berfungsi selamabash
diinstal dan berada di pengguna$PATH
(default$PATH
, mungkin dimodifikasi oleh pengguna) shell login seperti dengan~/.zshenv
untukzsh
,~/.cshrc
untukcsh
,~/.bashrc
untukbash
).POSIXly (meskipun dalam praktiknya, Anda mungkin menemukan bahwa lebih banyak sistem memiliki
bash
perintah daripadapax
perintah), Anda dapat melakukannya:-s
menerapkan pergantian ke jalur yang ditransfer. Ketika penggantian itu tidak menghasilkan apa-apa, file tersebut dikecualikan. Masalahnya adalah bahwa substitusi juga berlaku untuk target symlink. Itu sebabnya kami menggunakan di.//.
atas untuk mengurangi kemungkinan symlink terpengaruh.sumber
Saya tidak berpikir
ssh
terbatas untuk menggunakansh
. Ini lebih tergantung pada apa yang diinstal pada sistem target, bagaimana pengguna diatur, dan apa shell yang diizinkan masuk/etc/shells
.Apakah Anda mempertimbangkan
chsh
perintahnya?sumber
Jika Anda ingin melakukannya dengan cepat, Anda dapat melihatnya
rsync
dengan algoritma enkripsi yang berbeda. Ini memberi Anda pilihan untuk dengan mudah mengecualikan dll, dengan kecepatan pengorbanan tidak banyak.rsync -aHAXxv --numeric-ids --progress -e "ssh -T -c arcfour -o Compression=no -x" user@<source>:<source_dir> <dest_dir>
bersama-sama dengan menambahkan
arcfour
enkripsi ke garis start denganCiphers
di/etc/ssh/ssh_config
, jika belum diaktifkan, memberikan kecepatan yang dapat diterima.PERINGATAN:
arcfour
Enkripsi tidak aman . JANGAN menjalankan ini di saluran yang tidak aman. Jika Anda khawatir tentang akses ke server dari saluran tidak aman menggunakanarcfour
enkripsi, ubahetc/ssh/ssh_config
dengan bagian khusus host untuk host sumber Anda - BuatHost
bagian di ssh_config Anda untuk host sumber Anda, Anda dapat menggunakannyaCiphers arcfour
untuk mencerminkan-c
saklar di atas , yang membatasiarcfour
enkripsi hanya untuk host ini.Untuk detailnya, lihat
ssh_config
halaman manual.Namun, jika CPU Anda mendukung set instruksi AES-NI, coba beralih ke [email protected] (ya, itulah nama sandi, termasuk @ barang), yang akan menggunakan blazingly fast (dengan AES-NI) AES128 -GCM.
Jadi, dengan CPU yang mendukung AES-NI, ubah
"ssh -T -c arcfour -o Compression=no -x"
ke"ssh -T -c [email protected] -o Compression=no -x"
untuk hasil yang lebih aman.Penjelasan
rsync
-z
, itu jauh lebih lambat)a
: mode arsip - rescursive, mempertahankan pemilik, mempertahankan izin, mempertahankan waktu modifikasi, mempertahankan grup, menyalin symlink sebagai symlink, mempertahankan file perangkat.H
: mempertahankan tautan kerasA
: mempertahankan ACLX
: mempertahankan atribut yang diperluasx
: jangan melewati batas sistem filev
: meningkatkan verbositas--numeric-ds
: jangan memetakan nilai uid / gid berdasarkan nama pengguna / grup--delete
: hapus file asing dari direktori tujuan (pembersihan diferensial selama sinkronisasi)--progress
: tampilkan kemajuan selama transferssh
T
: matikan pseudo-tty untuk mengurangi beban cpu di tujuan.c arcfour
: gunakan enkripsi SSH terlemah tetapi tercepat. Harus menentukan "Ciphers arcfour" di sshd_config pada tujuan.o Compression=no
: Matikan kompresi SSH.x
: matikan penerusan X jika diaktifkan secara default.Daging sapi ada dalam
ssh
opsi - jika Anda hanya menggunakanrsync -av
dan-e ssh -T -c arcfour -o Compression=no -x"
bagian, Anda bisa mendapatkan kecepatan ini juga.Perbandingan:
rsync -az
scp -Cr
rsync -a
sftp
scp -r
sftp -R 128 -B 65536
rsync -a -P -e "ssh -T -c arcfour -o Compression=no -x"
scp -r -c arcfour
sftp -oCiphers=arcfour
Sumber :
https://gist.github.com/KartikTalwar/4393116
http://nz2nz.blogspot.com/2018/05/rsync-scp-sftp-speed-test.html
sumber
cp -r
dalam sistem jarak jauh, sehingga enkripsi yang digunakan oleh koneksi SSH tidak benar-benar relevan. Dalam hal apapunarcfour
dianggap agak rusak dan OpenSSH menonaktifkannya bersama dengan orang lain di server secara default sejak versi 6.7 (2014-10-06) . Bagaimanapun,ssh -o Ciphers='aes128-ctr'
berikan saya sekitar 90 MB / s, yang seharusnya cukup cepat pada tautan 1 Gbit / s.Sesuai perhitungan saya, salinan lengkap tercepat selalu menggunakan 'tar' (di sini mengasumsikan GNU
tar
atau kompatibel).Dan
tar
memiliki banyak pilihan untuk memanipulasi atribut, izin dan pemilihan / pengecualian file. Sebagai contoh, perintah di atas tidak termasuk subfolder tingkat atas yang disebut .thumbcache saat menyalin.sumber
--exclude=.thumbcache
tidak termasuk semua yang.thumbcache
file, tidak hanya satu di tingkat atas. Dengan GNUtar
(tidakbsdtar
), Anda hanya dapat menggunakan--exclude=./.thumbcache
untuk mengecualikan.thumbcache
file tingkat atas .