Допустим, вы находитесь на hostC (клиент) и хотите скопировать файлы с userX @ hostA на userY@hostB.
Вы можете выполнить команду scp на hostC:
scp userX@hostA:file-to-copy userY@hostB:destination-folder/
Однако вам необходимо пройти аутентификацию.Если у вас настроен ssh-ключ для аутентификации userX @ hostA, то он будет работать нормально.
Однако scp
вызовет ssh
с опциями отключения или переадресации агента или сброса ключей пересылки, так что даже если выиметь ключ для userY @ hostB, он не будет доступен для hostB, и вам будет предложено ввести пароль.
Одним из решений этого является передача -S <ssh-command>
для вызова scp
наhostC
со сценарием-оберткой для удаления параметров, которые запрещают переадресацию агента, возможно, необходимо явно включить его.
Например,
ssh-wrapper.py
#!/usr/bin/python
import sys, os
def is_exe(fpath):
return os.path.exists(fpath) and os.access(fpath, os.X_OK)
def which(program):
fpath, fname = os.path.split(program)
if fpath:
if is_exe(program):
return program
else:
for path in os.environ["PATH"].split(os.pathsep):
exe_file = os.path.join(path, program)
if is_exe(exe_file):
return exe_file
return None
if __name__ == '__main__':
ssh = which('ssh')
assert ssh is not None
args = [ssh] + sys.argv[1:]
for x in ('-a','-oClearAllForwardings yes'):
if x in args:
args.remove(x)
if '-oForwardAgent yes' not in args:
args.insert(1,'-oForwardAgent yes')
os.execl(ssh,*args)
Вызовscp
:
scp -S ssh-wrapper.py userX@hostA:file-to-copy userY@hostB:destination-folder/