所以,我已经通过ssh与远程机器建立了连接;现在我想做的是执行一些命令,抓取一些文件并将它们复制回主机。
我知道我可以运行
ssh user@host "command1; command2;....command_n"
然后关闭连接,但是如何在不使用上述语法的情况下执行相同操作?我有很多复杂的命令,有一堆引号和字符,这将是一个混乱逃脱。
谢谢!
答案 0 :(得分:1)
我的直接想法是为什么不创建一个脚本并将其推送到远程计算机以使其在文本文件中本地运行?如果你出于某种原因无法做到这一点,我就会对此进行调整,我认为你可能会对HEREDOC做得很好:
ssh -t jane@stackoverflow.com bash << 'EOF'
command 1 ...
command 2 ...
command 3 ...
EOF
它似乎做对了。与你的heredoc一起玩,以保持你的报价安全,但它会变得棘手。我可以提供的唯一的另一件事(我完全不推荐这个)是你可以使用像perl
这样的玩具来读写ssh
进程,就像这样:
open S, "| ssh -i ~/.ssh/host_dsa -t jane@stackoverflow.com bash";
print S "date\n"; # and so on
但这是一个非常糟糕的事情。请注意,您可以使用其他语言执行此操作。
答案 1 :(得分:0)
而不是shell使用一些脚本语言(Perl,Python,Ruby等)和一些负责丑陋工作的模块。例如:
#!/usr/bin/perl
use Net::OpenSSH;
my $ssh = Net::OpenSSH->new($host, user => $user);
$ssh->system('echo', 'Net::Open$$H', 'Quot%$', 'Th|s', '>For', 'You!');
$ssh->system({stdout_file => '/tmp/ls.out'}, 'ls');
$ssh->scp_put($local_path, $remote_path);
my $out = $ssh->capture("find /etc");
答案 2 :(得分:0)
从这里开始:Can I ssh somewhere, run some commands, and then leave myself a prompt?
使用expect脚本看起来非常简单......为方便起见,从上面的链接复制,不是我的,但我发现它非常有用。
#!/usr/bin/expect -f
spawn ssh $argv
send "export V=hello\n"
send "export W=world\n"
send "echo \$V \$W\n"
interact
我猜猜像
这样的一行send "scp -Cpvr someLocalFileOrDirectory you@10.10.10.10/home/you
会把你的档案拿回来......
然后:
send "exit"
将终止会话 - 或者您可以以交互结束并自行输入退出..