Получите ssh к сигналам прямого направления

Вы делаете, если Ваш текущий каталог не находится в Вашем пути. Если Вы когда-нибудь входите в систему как корень или являетесь sudoer, я не рекомендую добавить текущий каталог к пути. Просто выносите./

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

22
11.06.2012, 18:01
5 ответов

Короткий ответ:

ssh -t fs "stty isig intr ^N -echoctl ; trap '/bin/true' SIGINT; sleep 1000; echo f" > foo

и остановите программу CTRL+N.

Долгое объяснение:

  1. Необходимо использовать stty опция intr изменить Ваш сервер или локальный символ прерывания для не столкновения друг с другом. В команде выше я изменил символ прерывания сервера на CTRL+N. Можно изменить локальный символ прерывания и оставить один сервера без любых изменений.
  2. Если Вы не хотите, чтобы символ прерывания был в Вашем выводе (и какой-либо другой управляющий символ) использование stty -echoctl.
  3. Необходимо гарантировать, что управляющие символы включаются на ударе сервера, вызванном sshd. Если Вы не делаете можно закончить с процессами, все еще бродящими вокруг после того, как Вы выходите из системы. stty isig
  4. Вы на самом деле ловите SIGINT сигнал trap '/bin/true' SIGINT с пустым оператором. Без прерывания у Вас не будет stdout после сигнала SIGINT на Вашем конце.
10
27.01.2020, 19:43
  • 1
    Это, кажется, не имеет дело приятно с двоичным входом: seq 1000 | gzip | ssh-t-t сервер "stty isig предает ^N-echoctl земле; захватите '/bin/true' SIGINT; сон 1; zcat|bzip2" | bzcat> нечто; –  Ole Tange 06.06.2012, 14:28
  • 2
    Вы не можете прервать консолью при установке стандартного входа для ssh для чего-то другого затем консоль. В этом случае необходимо прервать stdin потоком. –  digital_infinity 06.06.2012, 14:58
  • 3
    я нашел что это seq 1000 | gzip | ssh -tt dell-test "zcat|bzip2" | bzcat > foo не работает также. Чтобы иметь эту команду работают, мы должны удалить -tt . Таким образом, выделение псевдотерминала, вероятно, берет некоторый вход от stdin –  digital_infinity 06.06.2012, 15:23
  • 4
    , я попробовал Uuencode. В этой версии это не работает: кошка foo.gz | жемчуг-ne 'пакет печати ("u", $ _)' | ssh-t-t сервер 'жемчуг-ne "печать распаковывает (\"u \",\$ _)" | zcat | gzip | жемчуг-ne "пакет печати (\"u \",\$ _)"' |, жемчуг-ne 'печать распаковывает ("u", $ _)'> foo2.gz –  Ole Tange 06.06.2012, 15:56
  • 5
    у меня есть это: (sleep 1; seq 1000 ) | gzip | uuencode bin | ssh -tt dell-test "stty isig intr ^N -echoctl -echo ; trap '/bin/true' SIGINT; sleep 1; uudecode -o /dev/stdout | zcat |bzip2 | uuencode bin2 " | uudecode -o /dev/stdout | bzcat >foo . Хотя символ прерывания не работает - нам нужен некоторый метод передачи для символа прерывания, в то время как stdin занят. –  digital_infinity 06.06.2012, 16:27

Я думаю, что Вы могли найти PID процесса, Вы работаете на сервере и отправляете сигнал с помощью другого ssh команда (как это: ssh server "kill -2 PID").

Я использую этот метод для отправки сигналов реконфигурирования к приложениям, работающим на другой машине (мои приложения ловят SIGUSR1 и читают файл конфигурации). В моем выявлении заболевания PID легок, потому что у меня есть уникальные имена процесса, и я могу найти PID путем отправки a ps запрос через ssh.

2
27.01.2020, 19:43
  • 1
    я не вижу пуленепробиваемый способ найти PID программы работавшим удаленный. Помните, что это дано пользователем. Это могло быть: исполнительный $ 'сервера ssh (повторяют fyrrc 1000 |/usr/games/rot13)' –  Ole Tange 06.06.2012, 14:40

Я перепробовал все решения, и это было лучшим:

ssh host "sleep 99 < <(cat; kill -INT 0)" <&1

https://stackoverflow.com/questions/3235180/starting-a-process-over-ssh-using-bash-and-then-killing-it-on-sigint/25882610#25882610

3
27.01.2020, 19:43

----- Command.SH

#! /bin/sh
trap 'trap - EXIT; kill 0; exit' EXIT
(sleep 1000;echo f) &
read ans

----- на местном терминале

sleep 864000 | ssh -T server command.sh > foo
0
27.01.2020, 19:43

Решение превратилось в http://www.gnu.org/software/parallel/parallel_design.html#Remote-Ctrl-C-and-standard-error-stderr

$SIG{CHLD} = sub { $done = 1; };
$pid = fork;
unless($pid) {
    # Make own process group to be able to kill HUP it later
    setpgrp;
    exec $ENV{SHELL}, "-c", ($bashfunc."@ARGV");
    die "exec: $!\n";
}
do {
    # Parent is not init (ppid=1), so sshd is alive
    # Exponential sleep up to 1 sec
    $s = $s < 1 ? 0.001 + $s * 1.03 : $s;
    select(undef, undef, undef, $s);
} until ($done || getppid == 1);
# Kill HUP the process group if job not done
kill(SIGHUP, -${pid}) unless $done;
wait;
exit ($?&127 ? 128+($?&127) : 1+$?>>8)
1
27.01.2020, 19:43

Теги

Похожие вопросы