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 |
它似乎做了正确的事情。玩你的Heredoc,以保持你的报价安全,但它会变得棘手。我唯一能提供的另一件事(我完全不建议这样做)是你可以使用像
1 2 3 |
但这真是一种卑鄙的方式。请注意,您可以用其他语言进行此操作。
从这里开始:我可以在某个地方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"); |