Как я могу записать удаленный файл? - PullRequest
34 голосов
/ 19 февраля 2009

Я пытаюсь найти хороший способ привязать файл на удаленном хосте. Это во внутренней сети машин Linux. Требования:

  1. Должен хорошо себя вести (без дополнительных процессов или продолжения производства)

  2. Не требует чьего-либо домашнего Perl-модуля для домашних животных.

  3. Может вызываться через Perl.

  4. Если возможно, не требуется настраиваемый скрипт или утилита на удаленном компьютере (обычные утилиты linux подходят)

Решения, которые я пробовал, обычно такого рода

ssh remotemachine -f <some command>

"какая-то команда" была:

tail -f logfile

Основной хвост не работает, потому что удаленный процесс продолжает записывать вывод в терминал после того, как локальный процесс ssh умирает.

$socket = IO:Socket::INET->new(...);
$pid = fork();
if(!$pid)
{
  exec("ssh $host -f '<script which connects to socket and writes>'");
  exit;
}

$client = $socket->accept;
while(<$client>)
{
  print $_;
}

Это работает лучше, потому что после выхода из локального процесса на экран не выводится, но удаленный процесс не обнаруживает, что его сокет не работает, и он живет бесконечно.

Ответы [ 8 ]

56 голосов
/ 19 февраля 2009

Вы пробовали

ssh -t remotemachine <some command>

-t опция со страницы руководства ssh:

 -t      Force pseudo-tty allocation. This can be used to execute 
         arbitrary screen-based programs on a remote machine, which
         can be very useful, e.g. when implementing menu services.
         Multiple -t options force tty allocation, even if ssh has no local tty.

вместо

 -f      Requests ssh to go to background just before command execution.  
         This is useful if ssh is going to ask for passwords or passphrases, 
         but the user wants it in the background.
         This implies -n.  The recommended way to start X11 programs at a remote
         site is with something like ssh -f host xterm.
2 голосов
/ 21 февраля 2010

Вы можете попробовать Survlog Только для OS X.

2 голосов
/ 19 февраля 2009

Некоторые идеи:

  • Вы можете смонтировать его через NFS или CIFS, а затем использовать File :: Tail .
  • Вы можете использовать один из SSH-модулей Perl (их несколько) в сочетании с tail -f.
1 голос
/ 08 мая 2012

Вы можете подключить файлы удаленно, используя bash и rsync. Следующий скрипт взят из этого урока: Удаленно подключайте файлы, используя bash и rsync

#!/bin/bash
#Code Snippet from and copyright by sshadmincontrol.com
#You may use this code freely as long as you keep this notice.

PIDHOME=/a_place/to/store/flag/file
FILE=`echo ${0} | sed 's:.*/::'`
RUNFILEFLAG=${PIDHOME}/${FILE}.running

if [ -e $RUNFILEFLAG ]; then
   echo "Already running ${RUNFILEFLAG}"
   exit 1
else
   touch ${RUNFILEFLAG}
fi

hostname=$1 #host name to remotlely access
log_dir=$2  #log directory on the remotehost
log_file=$3 #remote log file name
username=$3 #username to use to access remote host
log_base=$4 #where to save the log locally

ORIGLOG="$log_base/$hostname/${log_file}.orig"
INTERLOG="$log_base/$hostname/${log_file}.inter"
FINALLOG="$log_base/$hostname/${log_file}.log"

rsync -q -e ssh $username@$hostname:$log_dir/$log_file ${ORIGLOG}
grep -Ev ".ico|.jpg|.gif|.png|.css" > ${INTERLOG}  

if [ ! -e $FINALLOG ]; then
   cp  ${INTERLOG} ${FINALLOG}
else
   LINE=`tail -1 ${FINALLOG}`
   grep -F "$LINE" -A 999999999 ${INTERLOG} \
      | grep -Fv "$LINE" >> ${FINALLOG}
fi

rm ${RUNFILEFLAG}
exit 0
1 голос
/ 19 февраля 2009

Netcat должен сделать это за вас.

0 голосов
/ 19 февраля 2009

Кто-то предложил использовать nc (netcat). Это решение работает, но менее идеально, чем просто использование ssh -t. Самая большая проблема заключается в том, что вам нужно использовать nc на обеих сторонах соединения, и вам нужно выполнить некоторое обнаружение портов на локальной машине, чтобы найти подходящий порт для подключения. Вот адаптация вышеуказанного кода для использования netcat:

$pid = fork();
if(!$pid)
{
  exec("ssh $host -f 'tail -f $filename |nc $localhost $port'");
  exit;
}

exec("nc -l -p $port");
0 голосов
/ 19 февраля 2009

rsync: // [USER @] HOST [: PORT] / SRC ... [DEST] | хвост [DEST]?

0 голосов
/ 19 февраля 2009

Есть Файл :: Хвост . Не знаете, поможет ли это?

...