Когда используются операторы '==' и '! =', Строка справа от оператора считается шаблоном и сопоставляется в соответствии с правилами, описанными ниже в Сопоставление с шаблоном
Итак, когда вы включите в шаблон двойные кавычки, bash ожидает увидеть их в имени файла. Удалите двойные кавычки и / или ведущие
*
для успеха.if [[ $file == $patern ]] then echo "Match"; else echo "No Match"; fi
Я не хотел оставлять это в качестве ответа, но раздел комментариев стал больше, и вы получите уведомление от SE, чтобы перенести разговор в окно чата .
Итак, нажмите , введите
несколько раз и введите ~?
без пробелов. Нет, ничего.
вы должны увидеть что-то подобное (или точно так же)
Supported escape sequences:
~. - terminate connection (and any multiplexed sessions)
~B - send a BREAK to the remote system
~C - open a command line
~R - Request rekey (SSH protocol 2 only)
~^Z - suspend ssh
~# - list forwarded connections
~& - background ssh (when waiting for connections to terminate)
~? - this message
~~ - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)
в этот момент введите ~ C
, и вы должны увидеть приглашение ssh>
. На этом этапе введите
ssh> !scp /path/to/some/file/on/your/local/machine user@remoteserver
, поскольку вы уже аутентифицированы, он должен передать файл через существующее соединение.
В зависимости от того, насколько вы хотите автоматизировать, ожидайте
- это вариант для ретрансляции данных через хост-бастион и во внутренние системы. "вводя" что-то в сеанс SSH, как это сделал бы человек, только быстрее:
#!/usr/bin/env expect
if {[llength $argv] == 0} {
puts stderr "Usage: $argv0 bastion internalhost localfile"
exit 1
}
set basthost [lindex $argv 0]
set desthost [lindex $argv 1]
set fileup [lindex $argv 2]
spawn ssh -a -e none -o ClearAllForwardings=yes -x $basthost
# TODO login foo here for bastion host, e.g. send the password
# if see that prompt
expect {
# TODO handle timeout, eof, etc.
# TODO I have no idea what your ncurses interface looks
# like, though there's doubtless something that could
# be matched and the appropriate input sent to it...
-ex "$ " {
send -- "ssh $desthost\r"
# TODO handle subsequent login to the internal host here
}
}
Затем, когда у вас есть редактор или что-то еще, открытое на целевом хосте (с помощью соответствующих операторов send
), скармливайте ему данные via:
set upfd [open $fileup]
while {[gets $upfd line] >= 0} {
send -- "$line\r"
}
А затем используйте дополнительные вызовы send
для сохранения файла, выхода и т. д. Также, обработки ошибок и т. д.
Первое - это конфигурация, где вы настраиваете хост для прохождения через "дверь" или, скорее, jumpbox. Ваш ~/.ssh/config
будет выглядеть примерно так:
Host door
Hostname door.example.com
User username_on_door
# ...
Host target
Hostname tagret.example.com
User user_on_target
# ...
ProxyCommand ssh -W %h:%p door
Затем вы можете подключиться одной командой непосредственно к вашей целевой системе: ssh target
Затем вы также можете передавать файлы туда и обратно одной командой:
ssh taget "tar czpf - /some/important/data" | tar xzpf - -C /new/root/directory
tar cpf - /some/important/data | ssh target "tar xpf - -C /some/directory/"
или даже запустить sshfs
на этом хосте:
sshfs target:/dir/ /mnt/target
Не слишком сложно, не так ли?
Вы можете попробовать scp2
отсюдаhttps://github.com/alingse/scp2
Это глупый и медленный способ.
scp2 -f./scp2/core.py -u user@IP:~/core.py
здесь два шага
1. file --> base64 --> chunk --> ssh.execute(echo "[chunk body]" >> /tmpfile)
2. ssh.execute(cat /tmpfile | tr -d '\n' |base64 -d > dest)
На самом деле это зависит только от ssh
.