我自己尝试过,但是在脚本登录到远程计算机后,脚本会停止,这是可以理解的,因为远程计算机不知道脚本,但可以这样做吗?
由于
答案 0 :(得分: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'
答案 1 :(得分:2)
有多种方式:
答案 2 :(得分:1)
您需要在ssh调用结束时提供远程命令:
$ ssh user@remote somecommand
如果你需要实现一系列命令,那么编写脚本会更容易,将其复制到远程机器上(使用例如scp
)并按上面所示调用它。
答案 3 :(得分:1)
在这种情况下我更喜欢perl:
use Net::SSH::Perl;
my $ssh = Net::SSH::Perl->new($host);
$ssh->login($user, $pass);
my($stdout, $stderr, $exit) = $ssh->cmd($cmd);
它更不容易出错,并且在捕获命令的stdout,stderr和退出状态时可以更好地控制。
答案 4 :(得分:0)
~/.profile
(例如~/.bash_profile
)中的类似内容应该可以解决这个问题:
function remote {
ssh -t -t -t user@remote_server "$*'"
}
然后致电
remote somecommandofyours
答案 5 :(得分: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"
这将用函数的值替换对函数中global_var的任何引用。
干杯!