3

我自己尝试过,但是在脚本登录到远程机器后,脚本停止了,这是可以理解的,因为远程机器不知道脚本,但是可以做到吗?

谢谢

4

6 回答 6

5

试试here-doc

ssh user@remote << 'END_OF_COMMANDS'
echo all this will be executed remotely
user=$(whoami)
echo I am $user
pwd
END_OF_COMMANDS

当您说“继续在那里做事”时,您可能意味着与远程会话进行简单交互,然后:

expect -c 'spawn ssh user@host; interact'
于 2012-12-31T15:20:03.090 回答
2

有多种方式:

  1. ssh user@remote < script.txt
  2. scp 脚本 user@remote:/tmp/somescript.sh ; ssh user@remote /tmp/somescript.sh
  3. 编写一个期望 脚本

对于前两个选项,为了自动化,我建议使用公钥/私钥对登录。

于 2012-12-31T13:43:35.983 回答
1

您需要在 ssh 调用结束时提供远程命令:

$ ssh user@remote somecommand

如果你需要实现一系列命令,那么编写一个脚本,将它复制到远程机器(使用,例如scp)并调用它,如上所示,会更容易。

于 2012-12-31T12:59:03.040 回答
1

在这种情况下,我更喜欢 perl:

use Net::SSH::Perl;
my $ssh = Net::SSH::Perl->new($host);
$ssh->login($user, $pass);
my($stdout, $stderr, $exit) = $ssh->cmd($cmd);

它不易出错,并且在捕获命令的标准输出、标准错误和退出状态时给了我更好的控制。

于 2012-12-31T13:39:28.243 回答
0

~/.profile(或~/.bash_profile例如)中的类似内容应该可以解决问题:

function remote {
    ssh -t -t -t user@remote_server "$*'"
}

然后打电话

remote somecommandofyours
于 2012-12-31T13:05:28.940 回答
0

我通过使用declare -f将整个函数通过 ssh 传递到远程服务器然后在那里执行它来解决了这个问题。这实际上可以很简单地完成。唯一需要注意的是,您必须确保函数使用的任何变量要么在其内部定义,要么作为参数传入。如果您的函数使用任何类型的环境变量、别名、其他函数或在其外部定义的任何其他变量,它将无法在远程计算机上运行,​​因为这些定义将不存在。

所以,我是这样做的:

somefunction() {
    host=$1
    user=$2
    echo "I'm running a function remotely on $(hostname) that was sent from $host by $user"
}

ssh $someserver "$(declare -f somefunction);somefunction $(hostname) $(whoami)"

请注意,如果您的函数确实使用了任何类型的“全局”变量,则可以通过使用 sed 或我更喜欢的 perl 进行模式替换,在声明函数之后替换这些变量。

declare -f somefunction | perl -pe "s/(\\$)global_var/$global_var/g"

This will replace any reference to the global_var in the function with the value of the variable.

Cheers!

于 2013-04-04T16:32:40.173 回答