Est-il possible de faire cela:
ssh user@socket command /path/to/file/on/local/machine
C'est-à-dire que je veux exécuter une commande à distance en utilisant un fichier local en une seule étape, sans d'abord utiliser scp
pour copier le fichier.
Est-il possible de faire cela:
ssh user@socket command /path/to/file/on/local/machine
C'est-à-dire que je veux exécuter une commande à distance en utilisant un fichier local en une seule étape, sans d'abord utiliser scp
pour copier le fichier.
Réponses:
Vous avez manqué un seul symbole =)
ssh user@socket command < /path/to/file/on/local/machine
scp
avant.
/dev/stdin
ou -
. Peut ou peut ne pas fonctionner ( /dev/stdin
est un fichier, mais sa recherche échouera)
Une façon qui fonctionne quelle que soit la commande est de rendre le fichier disponible sur la machine distante via un système de fichiers distant. Puisque vous avez une connexion SSH:
# 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
Comme alternative à la bash
substitution de processus <(cat -)
ou < <(xargs -0 -n 1000 cat)
(voir ci-dessous), vous pouvez simplement utiliser xargs
et cat
diriger le contenu des fichiers spécifiés vers wc -l
(qui est plus portable).
# 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)"'