Подтвердить что ты не робот

Как я могу забрать удаленный файл?

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

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

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

  • Может быть вызван через Perl.

  • Если это возможно, не требуется специально созданная script или утилита на удаленном компьютере (обычные утилиты 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 $_;
}

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

4b9b3361

Ответ 1

Вы пробовали

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

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

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

Ответ 3

Вы можете попробовать Survlog Его OS X только.

Ответ 4

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

Ответ 5

Вы можете удаленно управлять файлами с помощью bash и rsync. Из этого урока взято следующее script: Отключить файлы с помощью 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 [email protected]$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

Ответ 6

Существует File:: Tail. Не знаете, помогает ли это?

Ответ 7

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

Ответ 8

Кто-то предложил использовать 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");