Попробуйте следующее: -
def takeInput(required):
print 'ooo or OOO to exit'
ans = raw_input('Enter: ')
if not ans:
print "You entered nothing...!"
return takeInput(required)
## FOR Exit ##
elif ans in ['ooo', 'OOO']:
print "Closing instance."
exit()
else:
if ans.isdigit():
current = 'int'
elif set('[~!@#$%^&*()_+{}":/\']+$').intersection(ans):
current = 'other'
elif isinstance(ans,basestring):
current = 'str'
else:
current = 'none'
if required == current :
return ans
else:
return takeInput(required)
## pass the value in which type you want [str/int/special character(as other )]
print "input: ", takeInput('str')
Я не знаю, как скопировать файл напрямую в одну команду, но если вы можете уступить запуск экземпляра SSH в фоновом режиме, чтобы просто открыть туннель переадресации портов, вы можете скопировать файл в одна команда.
Нравится это:
# First, open the tunnel
ssh -L 1234:remote2:22 -p 45678 user1@remote1
# Then, use the tunnel to copy the file directly from remote2
scp -P 1234 user2@localhost:file .
Обратите внимание, что вы подключаетесь как user2@localhost
в действительной команде scp
, потому что она находится на порту 1234 на localhost, что первая Экземпляр ssh
прослушивает прямые соединения с remote2
. Также обратите внимание, что вам не нужно запускать первую команду для каждой последующей копии файла; вы можете просто оставить его работать.
Это сделает трюк:
scp -o 'Host remote2' -o 'ProxyCommand ssh user@remote1 nc %h %p' user@remote2:path/to/file .
Чтобы напрямую передать файл с узла remote2
, добавьте два параметра (Host
и ProxyCommand
) к вашему ~ / .ssh / config (см. также ответ на суперпользователе). Затем вы можете запустить:
scp user@remote2:path/to/file .
с вашей локальной машины, не задумываясь о remote1
.
-o 'Host remote2'
не кажется действительно необходимым при запуске из командной строки (т. Е. Копировать один раз, не касаясь ~ / .ssh / config)
– Mike
3 February 2014 в 16:57
-o 'Host remote2'
. Благодарю.
– sinner
27 October 2017 в 09:54
ssh
Даже в сложном случае вы можете обрабатывать передачу файлов с помощью одной командной строки, просто с помощью ssh
;-) И это полезно, если remote1
не может подключиться к localhost
:
ssh user1@remote1 'ssh user2@remote2 "cat file"' > file
tar
Но вы потеряете свойства файла (право собственности, разрешения ...).
Однако tar
ваш друг сохранит эти свойства файла:
ssh user1@remote1 'ssh user2@remote2 "cd path2; tar c file"' | tar x
Вы также можете сжать, чтобы уменьшить пропускную способность сети:
ssh user1@remote1 'ssh user2@remote2 "cd path2; tar cj file"' | tar xj
И tar
также позволяет переносить рекурсивный каталог через basic ssh
:
ssh user1@remote1 'ssh user2@remote2 "cd path2; tar cj ."' | tar xj
ionice
Если файл огромен и вы не хотите беспокоить другие важные сетевые приложения, вы можете пропустить ограничение пропускной способности сети, предоставляемое scp
и rsync
(например, scp -l 1024 user@remote:file
не использует более 1 Мбит / с).
Но обходной путь использует ionice
, чтобы сохранить одиночная командная строка:
ionice -c2 -n7 ssh u1@remote1 'ionice -c2 -n7 ssh u2@remote2 "cat file"' > file
Примечание: ionice
может быть недоступно в старых дистрибутивах.
С версией openssh 7.3 и выше это легко. Используйте параметр ProxyJump в файле конфигурации.
# Add to ~/.ssh/config
Host bastion
Hostname bastion.client.com
User userForBastion
IdentityFile ~/.ssh/bastion.pem
Host appMachine
Hostname appMachine.internal.com
User bastion
ProxyJump bastion # openssh 7.3 version new feature ProxyJump
IdentityFile ~/.ssh/appMachine.pem. #no need to copy pem file to bastion host
Команды для запуска для входа в систему или копирования
ssh appMachine # no need to specify any tunnel.
scp helloWorld.txt appMachine:. # copy without intermediate jumphost/bastion host copy.**
, вы можете указать хост хоста бастиона, используя опцию «-J» для команды ssh, если она не настроена в файле конфигурации ,
Заметка scp, похоже, не поддерживает флаг «-J». (я не мог найти в man-страницах. Однако над scp работает с настройкой файла конфигурации)
-p 45678
на-p 22
, так как мой remote1 SSH прослушивает порт 22 – Montaro 29 November 2015 в 15:46-p 22
вместо-p 45678
. Такжеscp -P 1234 ...
не работает для меня. Я получаюssh: connect to host localhost port 1234: Connection refused
. Когда я пытался сscp -P 22 ...
, он работает, но он копирует файл вremote 1
, а не на мой локальный компьютер (remote2
). – sinner 27 October 2017 в 09:53