Bash 预期:在sftp之后启动scp

Bash 预期:在sftp之后启动scp,bash,sftp,expect,scp,Bash,Sftp,Expect,Scp,我真的需要一些帮助。我对expect还是个新手。我需要在运行sftp之后直接启动scp命令 我让这个脚本的第一部分工作,我主要关心的是底部部分。我真的需要在这个命令完成后启动一个命令。我更希望能够生成另一个命令,而不是用sleep命令编写一些类似的东西,然后在10秒后运行它或其他奇怪的东西 非常感谢您的任何建议 spawn sftp user@host expect "password: " send "123\r" expect "$ " sleep 2 send "cd mydir\r" e

我真的需要一些帮助。我对expect还是个新手。我需要在运行sftp之后直接启动scp命令

我让这个脚本的第一部分工作,我主要关心的是底部部分。我真的需要在这个命令完成后启动一个命令。我更希望能够生成另一个命令,而不是用sleep命令编写一些类似的东西,然后在10秒后运行它或其他奇怪的东西

非常感谢您的任何建议

spawn sftp user@host
expect "password: "
send "123\r"
expect "$ "
sleep 2
send "cd mydir\r"
expect "$ "
sleep 2
send "get somefile\r"
expect "$ "
sleep 2
send "bye\r"
expect "$ "
sleep 2

spawn scp somefile user2@host2:/home/user2/
sleep 2
所以我发现,如果我使用“exec”而不是spawn,我实际上可以用它来启动子流程。。换言之:

exec scp somefile user2@host2:/home/user2/
唯一的问题是什么?它会提示我输入密码!这不应该发生,我已经在两个系统上安装了ssh密钥。(换句话说,如果我在运行此expect脚本的主机上运行scp命令,它将在不提示我输入密码的情况下运行)。我尝试scp到的系统必须将这个新生成的进程识别为新主机,因为它没有获取我的ssh密钥。有什么想法吗

顺便说一句,我很抱歉,我还没有发布一个“工作”脚本,我真的不能不压缩这个服务器的安全性。我希望这不会影响任何人帮助我的能力


我认为问题在于我没有终止最初产生的进程。我不太明白,希望你能把它做好。如果我尝试“close”或“eof”,它只会杀死整个脚本,我现在还不想这么做(因为我仍然需要将文件scp到第二台主机)。

确保SSH私钥加载到代理中,并且指向该代理的环境变量在调用scp的会话中处于活动状态

[[ $SSH_AUTH_SOCK ]] || {       # if no agent already running...
  eval "$(ssh-agent -s)"        # ...then start one...
  ssh-add /path/to/your/ssh/key # ...load your key...
  started_ssh_agent=1           # and flag that we started it ourselves
}

# ...put your script here...

[[ $started_ssh_agent ]] && {   # if we started the agent ourselves...
  eval "$(ssh-agent -s -k)"     # ...then clean up nicely when done.
}

另一方面,我强烈建议将问题中给出的代码替换为以下内容:

lftp -u user,123 -e 'get /mydir/somefile -o localfile' sftp://host </dev/null
lftp scp://user2@host2 -e 'put localfile -o /home/user2/somefile' </dev/null

lftp-u用户,123-e'get/mydir/somefile-o localfile'sftp://host 您正在向sftp发送命令,然后您想要执行scp命令,再次想要向sftp发送命令?Dinesh,我正在尝试通过sftp从主机a获取一个文件,并通过scp将其放置到主机b上。我们只提供通过SFTP访问HoST-A,因此使用HOST-A(或任何其他方法)上的SCP不是一个选项。您可以考虑使用(固有的脚本化)客户端,例如LFTP,它可以同时讲两种协议。不需要为两个不同的客户端编写脚本。主机a和主机b是否支持pubkey?这将比在脚本中存储明文密码更容易实现自动化,也更安全。我正在尝试将密钥存储在主机a上。同时,在完成之前,我必须为主机a使用明文。我确实在host-b上有我的钥匙(在我的系统上也有host-b的钥匙),这就是为什么我对这种行为感到困惑。Charles,这比我试图做的要简单得多。现在,我可以在我的主脚本中实际使用它,并在不使用$:(env)的情况下调用局部变量。。我希望有一天能学习tcl,但现在不是时候。我可以解决这个问题,我会用一个解决方案向大家汇报。查尔斯,我在expect land中迷失了方向,意识到lftp是多么简单。而且,它也更快!我修改了主脚本以使用lftp而不是expect。这个expect脚本是作为一个子进程启动的,所以现在我可以用一行lftp来删除它。谢谢:)@slugman,很乐意帮忙。顺便说一句,在代理关闭的时候,我并没有做正确的事情;请参见编辑。