Имейте в виду, что dd
- это необработанный интерфейс для read ()
, write ( )
и lseek ()
системный вызов. Вы можете надежно использовать его только для извлечения фрагментов данных из обычных файлов, блочных устройств и некоторых символьных устройств (например, / dev / urandom
), то есть файлов, для которых прочитано (buf, size)
гарантированно вернет размер
, пока не будет достигнут конец файла.
Для каналов, сокетов и большинства символьных устройств (например, ttys) у вас нет такой гарантии, если вы не выполните read ()
размера 1 или не используете расширение GNU dd
. iflag = fullblock
.
Или:
{
gdd < file1 bs=1M iflag=fullblock count=99 skip=1
gdd < file2 bs=1M iflag=fullblock count=10
} > final_output
Или:
M=1048576
{
dd < file1 bs=1 count="$((99*M))" skip="$M"
dd < file2 bs=1 count="$((10*M))"
} > final_output
Или с оболочками со встроенной поддержкой оператора поиска, например ksh93
:
M=1048576
{
command /opt/ast/bin/head -c "$((99*M))" < file1 <#((M))
command /opt/ast/bin/head -c "$((10*M))" < file2
}
Или zsh
(при условии, что ваш head
поддерживает здесь параметр -c
):
zmodload zsh/system &&
{
sysseek 1048576 && head -c 99M &&
head -c 10M < file2
} < file1 > final_output
пробовали ли вы запустить это путем повторения пароля в оболочке?
echo "echo 'yourpassword'; sudo -S -c 'ls -l / root'" | pssh -I -H hostlist.txt
Чтобы обеспечить максимально надежный пароль, попробуйте эту версию(pssh
в CentOS, Fedora и parallel-ssh
в Ubuntu, Debian):
stty -echo; printf "Password: "; read PASS; stty echo; echo "${PASS}" | \ ssh <USER>@localhost "sudo -S dmesg"
Обновление (спасибо @chutz):
read -s -p "Password: "; echo "${REPLY}" | \ ssh <USER>@localhost "sudo -S dmesg"
и затем адаптируйте его к pssh(обновите соответствующим образом):
read -s -p "Password: "; echo "${REPLY}" | \ pssh -H <USER>@localhost -o /tmp/output -I "sudo -S dmesg"
Я использую то же самое для специального -сбора дампов с нескольких серверов. Остановите его, используя Ctrl + C , как обычно. Он покажет [FAILURE] <HOST> Interrupted
, но это только потому, что в противном случае tcpdump работал бы бесконечно -, вывод по-прежнему находится в обычном месте. Опция -t 0
предназначена для того, чтобы соединение не прерывалось по тайм-ауту. Я также мог бы использовать tmux или screen и собрать дампы позже.
read -s -p "Password: "; echo "${REPLY}" | \ pssh -h <HOSTFILE> -o /tmp/output -t 0 -I "sudo -S tcpdump -l -nn -vv -i any not port 22"
Убедитесь, что вы указали правильного пользователя ssh и ранее подключались к этим серверам. Локальное тестирование обычно не позволяет отключить весь парк серверов. Вы можете использовать адреса 127.0.0.X вместо localhost для аппроксимации нескольких хостов.
Я хотел бы порекомендовать мой простой инструмент "spssh.sh" (https://github.com/tangruize/spssh), который прост (всего 36 sloc ), но достаточно полезен. В отличие от параллельного -ssh, spssh.sh является интерактивным и поддерживает параллельное/раздельное выполнение cmd. Надеюсь, поможет!