1

所以,我已经通过 ssh 与远程机器建立了连接;现在我想做的是执行一些命令,抓取一些文件并将它们复制回我的主机。

我知道我可以跑

ssh user@host "command1; command2;....command_n"

然后关闭连接,但是如果不使用前面提到的语法,我怎么能做同样的事情呢?我有很多复杂的命令,其中包含一堆引号和字符,很难逃脱。

谢谢!

4

3 回答 3

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

但这是一种非常糟糕的处理方式。请注意,您可以使用其他语言执行此操作。

于 2013-10-23T04:22:46.987 回答
0

使用一些脚本语言(Perl、Python、Ruby 等)和一些负责处理丑陋工作的模块来代替 shell。例如:

#!/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");
于 2013-10-23T06:21:56.183 回答
0

从这里: 我可以在某个地方 ssh,运行一些命令,然后给自己一个提示吗?

使用期望脚本似乎很简单......为了方便起见,从上面的链接复制,不是我的,但我发现它非常有用。

#!/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"

将终止会话 - 或者您可以以交互结束并自己输入退出..

于 2016-05-10T20:35:09.840 回答