Uzak bir komut nasıl yürütülür ve yerel dosyaya giriş olarak iletilir?


22

Bunu yapmak mümkün mü:

ssh user@socket command /path/to/file/on/local/machine

Yani, bir dosyayı yerel bir dosyayı kullanarak bir adımda, önce scpdosyayı kopyalamak için kullanmadan uzak bir komutu yürütmek istiyorum .


Uzak bilgisayarda yerel makinenin dosyasının bir ana dizininin bir ağ bağlantısına sahipseniz veya dosyayı ssh komutuna yeniden yönlendirirseniz mümkündür
h3rrmiller

Yanıtlar:


23

Sadece bir sembol özledin =)

ssh user@socket command < /path/to/file/on/local/machine

Tabii ki! Acaba neden ssh üzerinden giriş yönlendirmeyi düşünmedim?
jsj

Remote komutu yalnızca bir dosya argümanını alıp stdin'den okuyamazsa ne olur?
iruvar

@ChandraRavoori bu durumda daha scpönce kopyalamanız gerekir .
acele

4
@ChandraRavoori Ona dosya argümanını vermeyi deneyebilirsiniz /dev/stdinveya -. Mayıs ya da çalışmayabilir ( /dev/stdinbir dosyadır, ancak araştıramazsınız)
derobert

1
@derobert ve acele, onunla biraz oynadı ve bash altında işlem değiştirme kullanarak bunu yapmak için sert bir yol keşfetti. Bu hala arayış sınırlamasına tabidir ve ihtiyaç duyulacak tüm ek alıntılarla hantallaşabilir. Örnek izler. cat test.file | ssh user @ machine 'bash -c "wc - l <(cat -)"'
iruvar

4

Komuttan bağımsız olarak çalışan yollardan biri, dosyayı uzaktaki bir dosya sistemi üzerinden uzaktaki bilgisayarda kullanmaktır. Bir SSH bağlantınız olduğundan:

  1. Ters bir SSH tüneli kurun . Ayrıca bkz. SSH, dosyayı yerel sisteme kolayca kopyalayın
  2. Uzak makinede SSHFS ile paylaşılacak dosyayı içeren makinenin bir dizin ağacını takın . ( Örnek )

Neyse, bu yolla komut çalıştırmadan önce ek hareketler gerekir.
acele

@Gilles: Bence orijinal başlık yanıltıcıydı ve sorusunu yanıltıcı başlıklara dayanarak anladınız. Söyleyebileceğim kadarıyla, aslında yerel dosya üzerinde hareket etmek istemediğini düşündü , fakat sadece girdi olarak aktardı. (Ama cevabınız şaşırtıcı, doğru anlıyorsam! Belki de cevapladığınız soruyu sormalıyım, cevabı alabileceğiniz bir yere koymanız için size bir yer vermeliyim.) Bunu bedenle ve seçilen cevapla tutarlı kılmak.
iconoclast

@iconoclast Bunu yazarken aklımın durumunu hatırlamıyorum, ama bu cevaba katılıyorum. Bazı kurulumlar gerektirir ancak girişi kopyalamanın yeterli olmadığı diğer durumlarda derhal gereklilik dışında genelleme yapma avantajına sahiptir. Başka biri yapmamış olsaydı, yeniden yönlendirmeden de bahsederdim. Daha genel bir soru defalarca farklı şekillerde sorulmuştur.
Gilles 'SO- kötülük' dur

Tamam, cevabınızı yanlış anlamış olmalıyım. Denemedim, ancak bir ters tünel kurduğunuzdan (uzaktaki yerel makineye mi?) Yerel dosyanın uzaktaki makine tarafından değiştirilmesine izin verdiğiniz anlaşılıyor. Bu böyle değil mi?
iconoclast

@conconlast Evet, bu uzak makinenin yerel dosyayı değiştirmesine izin verir (ek olarak soruyu istediği gibi okumasını da sağlar).
Gilles 'SO- kötülük' dur

1
# What if remote command can only take a file argument and not read from stdin? (1_CR)
ssh user@socket command < /path/to/file/on/local/machine
...
cat test.file | ssh user@machine 'bash -c "wc -l <(cat -)"'  # 1_CR

Alternatif olarak bashsüreç ikamesi <(cat -)veya < <(xargs -0 -n 1000 cat)sadece kullanabilirsiniz (aşağıya bakınız) xargsve catbelirtilen dosyaların içeriğini borusuna wc -l(daha taşınabilir olan).

# Assuming that test.file contains file paths each delimited by an ASCII NUL character \0
# and that we are to count all those lines in all those files (provided by test.file).

#find . -type f -print0 > test.file
# test with repeated line count of ~/.bash_history file
for n in {1..1000}; do printf '%s\000' "${HOME}/.bash_history"; done > test.file

# xargs & cat
ssh localhost 'export LC_ALL=C; xargs -0 -n 1000 cat | wc -l' <test.file

# Bash process substitution
cat test.file | ssh localhost 'bash -c "export LC_ALL=C; wc -l < <(xargs -0 -n 1000 cat)"'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.