【问题标题】:how to script commands that will be executed on a device connected via ssh?如何编写将在通过 ssh 连接的设备上执行的命令?
【发布时间】:2013-06-03 08:09:15
【问题描述】:

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

我知道我可以跑

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

然后关闭连接,但是如果不使用前面提到的语法,我该如何做呢?我有很多复杂的命令,其中包含一堆引号和字符,这将是一团糟。

谢谢!

【问题讨论】:

标签: shell ssh


【解决方案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

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

【讨论】:

    【解决方案2】:

    使用一些脚本语言(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");
    

    【讨论】:

      【解决方案3】:

      从这里: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"
      

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

      【讨论】:

        猜你喜欢
        • 2019-01-09
        • 1970-01-01
        • 2011-10-31
        • 2021-08-23
        • 2015-08-06
        • 2021-05-26
        • 2011-09-10
        • 1970-01-01
        相关资源
        最近更新 更多