如何在shell脚本中使用ssh里面的scp

时间:2011-12-21 10:28:11

标签: scp

我有一台服务器ServerA(user1作为用户ID)。我想连接到同一服务器ServerA,用户ID为user2,然后执行scp从其他服务器获取文件并保留在ServerA服务器中(userid作为user2)。

有人可以请尽快帮助我。

2 个答案:

答案 0 :(得分:0)

将scp作为user1,然后将文件chown到user2会不会更容易?如果您需要将它们存储在只有user2可访问的位置,您可以转到user2并移动它们。

答案 1 :(得分:0)

假设您在hostC(客户端)上,并且您希望将文件从userX @ hostA复制到userY @ hostB。

您可以在hostC上发出scp命令:

scp userX@hostA:file-to-copy userY@hostB:destination-folder/

但是,您需要进行身份验证。如果为userX @ hostA设置了ssh密钥,则密钥验证将正常工作。

但是scp会调用ssh选项来禁用代理转发或清除转发密钥,这样即使你有一个用户名@ hostB的密钥,它也不会被hostB和你用系统会提示输入密码。

对此的一个解决方案是使用包装器脚本将-S <ssh-command>传递给scphostC的调用,以去除阻止代理转发的选项,可能必须明确启用它

e.g。

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/