我自己尝试过,但是在脚本登录到远程机器后,脚本停止了,这是可以理解的,因为远程机器不知道脚本,但是可以做到吗?
谢谢
试试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'
您需要在 ssh 调用结束时提供远程命令:
$ ssh user@remote somecommand
如果你需要实现一系列命令,那么编写一个脚本,将它复制到远程机器(使用,例如scp
)并调用它,如上所示,会更容易。
在这种情况下,我更喜欢 perl:
use Net::SSH::Perl;
my $ssh = Net::SSH::Perl->new($host);
$ssh->login($user, $pass);
my($stdout, $stderr, $exit) = $ssh->cmd($cmd);
它不易出错,并且在捕获命令的标准输出、标准错误和退出状态时给了我更好的控制。
您~/.profile
(或~/.bash_profile
例如)中的类似内容应该可以解决问题:
function remote {
ssh -t -t -t user@remote_server "$*'"
}
然后打电话
remote somecommandofyours
我通过使用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!