关于shell:如何编写将在通过ssh连接的设备上执行的命令?

how to script commands that will be executed on a device connected via ssh?

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

我知道我可以跑步

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

然后关闭连接,但是如果不使用前面提到的语法,我该怎么做呢?我有很多复杂的命令,其中有大量的引号和字符,这些字符将是一团乱麻。

谢谢!


我立刻想到的是,为什么不创建一个脚本并将其推送到远程计算机上,让它在文本文件中本地运行呢?如果你因为任何原因不能,我会摆弄这个,我想你可能会很好地处理一个Heredoc:

1
2
3
4
5
6
ssh -t [email protected] bash << 'EOF'
command 1 ...
command 2 ...
command 3 ...

EOF

它似乎做了正确的事情。玩你的Heredoc,以保持你的报价安全,但它会变得棘手。我唯一能提供的另一件事(我完全不建议这样做)是你可以使用像perl这样的玩具来读和写ssh过程,就像这样:

1
2
3
open S,"| ssh -i ~/.ssh/host_dsa -t [email protected] bash";
print S"date
"; # and so on

但这真是一种卑鄙的方式。请注意,您可以用其他语言进行此操作。


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

使用Expect脚本似乎非常简单…从上面的链接复制方便,不是我的,但我发现它非常有用。

1
2
3
4
5
6
7
8
9
#!/usr/bin/expect -f
spawn ssh $argv
send"export V=hello
"
send"export W=world
"
send"echo \$V \$W
"
interact

我猜是这样

1
send"scp -Cpvr someLocalFileOrDirectory [email protected]/home/you

会把你的文件拿回来…

然后:

1
send"exit"

将终止会话-或者您可以以交互结束,然后自己键入退出。


而不是shell使用一些脚本语言(perl、python、ruby等)和一些处理难看工作的模块。例如:

1
2
3
4
5
6
7
#!/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");