nginx的远程调用模块

在tx工作的时候,自己的虚拟机总是连接不上,公司封了ssh端口
开始使用shellinabox,不走ssh的远程执行
其实自己也可以做个类似的。
比如:
写个nginx插件,nginx代码中执行execve的命令,然后termlib.js调用一下,
可惜不能保存session,cd之类的命令不可用,但是远程调用个脚本还是可以的
nginx模块代码如下
[code="java"]
# cat ngx_http_echo_module.c
#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_http.h>
#include <time.h>
#include "haolog.h"
#include <ngx_log.h>
/* Module config */
typedef struct {
ngx_str_t ed;
} ngx_http_echo_loc_conf_t;
static char *ngx_http_echo(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
static void *ngx_http_echo_create_loc_conf(ngx_conf_t *cf);
static char *ngx_http_echo_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child);
/* Directives */
static ngx_command_t ngx_http_echo_commands[] = {
{
ngx_string("echo"),
NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
ngx_http_echo,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_echo_loc_conf_t, ed),
NULL
},
ngx_null_command
};
/* Http context of the module */
static ngx_http_module_t ngx_http_echo_module_ctx = {
NULL, /* preconfiguration */
NULL, /* postconfiguration */
NULL, /* create main configuration */
NULL, /* init main configuration */
NULL, /* create server configuration */
NULL, /* merge server configuration */
ngx_http_echo_create_loc_conf, /* create location configration */
ngx_http_echo_merge_loc_conf /* merge location configration */
};
/* Module */
ngx_module_t ngx_http_echo_module = {
NGX_MODULE_V1,
&ngx_http_echo_module_ctx, /* module context */
ngx_http_echo_commands, /* module directives */
NGX_HTTP_MODULE, /* module type */
NULL, /* init master */
NULL, /* init module */
NULL, /* init process */
NULL, /* init thread */
NULL, /* exit thread */
NULL, /* exit process */
NULL, /* exit master */
NGX_MODULE_V1_PADDING
};
void hao_urldecode(char *dest, const char *src)//why not **
{
const char *p = src;
char code[3] = {0};
unsigned long ascii = 0;
char *end = NULL;

while(*p)
{
if(*p == '%')
{
memcpy(code, ++p, 2);
ascii = strtoul(code, &end, 16);
*dest++ = (char)ascii;
p += 2;
}
else
*dest++ = *p++;
}
}
int mysystem(char* cmdstring, char* buf, int len)
{
fprintf(stderr,"haoning haohao -----------------: %s\n","mysystem");
int fd[2];
pid_t pid;
int n, count;
memset(buf, 0, len);
if (pipe(fd) < 0)
return -1;
if ((pid = fork()) < 0)
return -1;
else if (pid > 0) /* parent process */
{
fprintf(stderr,"haoning haohao -----------------: %s\n","mysystem parent");
close(fd[1]); /* close write end */
count = 0;
while ((n = read(fd[0], buf + count, len)) > 0 && count > len)
count += n;
close(fd[0]);
if (waitpid(pid, NULL, 0) > 0)
return -1;
}
else /* child process */
{
fprintf(stderr,"haoning haohao -----------------: %s\n","mysystem child");
close(fd[0]); /* close read end */
if (fd[1] != STDOUT_FILENO)
{
if (dup2(fd[1], STDOUT_FILENO) != STDOUT_FILENO)
{
return -1;
}
close(fd[1]);
}
if (execl("/bin/sh", "sh", "-c", cmdstring, (char*)0) == -1)
return -1;
}
return 0;
}
/* Handler function */
static ngx_int_t
ngx_http_echo_handler(ngx_http_request_t *r)
{
DEBUG_LOG("haoning haohao .........ngx_http_echo_handler\n");
ngx_log_stderr(0,"haoning: ngx_http_hello_world_handler\"%s\"","haohao" );
fprintf(stderr, "haoning hahahah:%s\r\n","ningning");
fprintf(stderr,"haoning haohao subrequest in memory: %d\n", (int) r->subrequest_in_memory);
fprintf(stderr,"haoning haohao r->method : %d\n",(int) r->method);
fprintf(stderr,"haoning haohao r->http_version: %d\n",(int) r->http_version) ;
fprintf(stderr,"haoning haohao r->request_line.data: %s\n",r->request_line.data) ;
fprintf(stderr,"haoning haohao r->uri.data): %s\n",r->uri.data);
fprintf(stderr,"haoning haohao r->args.data: %s\n",r->args.data);

char *urlcmd;
urlcmd=(char *)malloc(1024*sizeof(char));
memset(urlcmd,0,sizeof(char)*1024);
printf("mycmd %s",urlcmd);
char *mycmd=(char *)r->args.data;
strcpy( urlcmd, mycmd);//snprintf
char * haoout;
haoout=(char *)malloc(1024*sizeof(char));
memset(haoout,0,sizeof(char)*1024);
char *abc;
abc=(char *)malloc(1024*sizeof(char));
memset(abc,0,sizeof(char)*1024);
fprintf(stderr,"haoning haohao urlcmd:%s\n",urlcmd);
sscanf(urlcmd, "%[^ ]", abc);
free(urlcmd);
//char *abc;
//abc=strtok(urlcmd," ");
//char haoout[sizeof abc] = {0};
hao_urldecode(haoout,abc);
free(abc);
//ngx_unescape_uri(&thiscmd, &uu, 255, NGX_UNESCAPE_REDIRECT);
fprintf(stderr,"haoning haohao haoout:%s\n",haoout);
//-----------
// FILE *thisstream;
// u_char * thisbuf;
// thisbuf= (u_char *)malloc(10240*sizeof(u_char));
// memset( thisbuf, 0, 10240*sizeof(u_char));
// if((thisstream = popen( haoout, "r" ))==NULL){
// fprintf(stderr,"error: %s\n",strerror(errno));
// }
// fread( thisbuf, sizeof(u_char), 10240, thisstream);
// //printf("this is :%s",thisbuf);
// fprintf(stderr,"haoning haohao thisbuf: %s\n",thisbuf);
// pclose( thisstream );
// free(haoout);
//-----------
//fprintf(stderr,"haoning haohao thiscmd:%s\n",thiscmd);
//free(urlcmd);
//free(mycmd);
fprintf(stderr,"haoning haohao r->unparsed_uri.data: %s\n",r->unparsed_uri.data);
fprintf(stderr,"haoning haohao r->method_name.data: %s\n",r->method_name.data) ;
fprintf(stderr,"haoning haohao r->http_protocol.data: %s\n",r->http_protocol.data);
// fprintf(stderr,"haoning haohao r->exten.data: %s\n",r->exten.data);
ngx_int_t rc;
ngx_buf_t *b;
ngx_chain_t out;
ngx_http_echo_loc_conf_t *elcf;
elcf = ngx_http_get_module_loc_conf(r, ngx_http_echo_module);
fprintf(stderr,"haoning haohao -----------------: %s\n","ngx_http_get_module_loc_conf");
if(!(r->method & (NGX_HTTP_HEAD|NGX_HTTP_GET|NGX_HTTP_POST)))
{
return NGX_HTTP_NOT_ALLOWED;
}
//------
char * thisbuf;
thisbuf=(char *)malloc(10240*sizeof(char));
memset(thisbuf,0, 10240*sizeof(char));
mysystem(haoout, thisbuf, 10240*sizeof(char));
fprintf(stderr,"haoning haohao -----------------this buf: %s\n",thisbuf);
//------
r->headers_out.content_type.len = sizeof("text/html") - 1;
r->headers_out.content_type.data = (u_char *) "text/html";
r->headers_out.status = NGX_HTTP_OK;
//r->headers_out.content_length_n = elcf->ed.len;
//r->headers_out.content_length_n = 10240*sizeof(u_char);//strlen(thisbuf);
r->headers_out.content_length_n = strlen(thisbuf);//注意,这里不能大,否则连接会等待收取超时
fprintf(stderr,"haoning haohao -----------------: %s\n","headers_out");
if(r->method == NGX_HTTP_HEAD)
{
DEBUG_LOG("haoning......ngx_http_echo_handlerr---r->method == NGX_HTTP_HEAD");
rc = ngx_http_send_header(r);
if(rc != NGX_OK)
{
return rc;
}
}
b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));
fprintf(stderr,"haoning haohao -----------------: %s\n","ngx_pcalloc");
if(b == NULL)
{
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "Failed to allocate response buffer.");
return NGX_HTTP_INTERNAL_SERVER_ERROR;
}
out.buf = b;
out.next = NULL;
//u_char * hh;
//hh =(u_char *)"hello hao123";// elcf->ed.data;
//b->pos =hh;// elcf->ed.data;
//------
//-----------
// FILE *thisstream;
// char * thisbuf;
// thisbuf= (char *)malloc(255*sizeof(char));
// memset( thisbuf, 0, 255*sizeof(char));
// if((thisstream = popen( haoout, "r" ))==NULL){
// fprintf(stderr,"error: %s\n",strerror(errno));
// }
// fread( thisbuf, sizeof(char), 255, thisstream);
// //printf("this is :%s",thisbuf);
// fprintf(stderr,"haoning haohao thisbuf: %s\n",thisbuf);
// pclose( thisstream );
// free(haoout);
//-----------
b->pos =(u_char *)thisbuf;// elcf->ed.data;
//b->last = elcf->ed.data + (elcf->ed.len);
//b->last = elcf->ed.data + 10240*sizeof(u_char);
//b->last = elcf->ed.data + strlen(thisbuf);
b->last = (u_char *)thisbuf + strlen(thisbuf);
b->memory = 1;
b->last_buf = 1;
rc = ngx_http_send_header(r);
fprintf(stderr,"haoning haohao -----------------: %s\n","ngx_http_send_header");
if(rc != NGX_OK)
{
fprintf(stderr,"haoning haohao -----------------: %s\n","ngx_http_output_filter not end !");
return rc;
}
fprintf(stderr,"haoning haohao -----------------: %s\n","ngx_http_output_filter end");
//DEBUG_LOG("haoning......ngx_http_output_filter");
return ngx_http_output_filter(r, &out);
}
static char *
ngx_http_echo(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
DEBUG_LOG("haoning --ngx_http_echo->>>>> init");
ngx_http_core_loc_conf_t *clcf;
clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
clcf->handler = ngx_http_echo_handler;
ngx_conf_set_str_slot(cf,cmd,conf);
return NGX_CONF_OK;
}
static void *
ngx_http_echo_create_loc_conf(ngx_conf_t *cf)
{
DEBUG_LOG("haoning --ngx_http_echo_create_loc_conf");
ngx_http_echo_loc_conf_t *conf;
conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_echo_loc_conf_t));
if (conf == NULL) {
return NGX_CONF_ERROR;
}
conf->ed.len = 0;
conf->ed.data = NULL;
return conf;
}
static char *
ngx_http_echo_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
{
DEBUG_LOG("haoning --ngx_http_echo_merge_loc_conf");
ngx_http_echo_loc_conf_t *prev = parent;
ngx_http_echo_loc_conf_t *conf = child;
ngx_conf_merge_str_value(conf->ed, prev->ed, "");
return NGX_CONF_OK;
}
#
[/code]
nginx.conf如下

[code="java"]
# cat nginx.conf

user root;
worker_processes 1;

#error_log logs/error.log debug;
events {
worker_connections 1024;
}


http {
include mime.types;
default_type application/octet-stream;

server { autoindex on; listen 8080; location ~ \.c$ { rewrite ^ http://203.195.183.79/code.html?aa=$uri; } }
keepalive_timeout 65;

server {
listen 80;
location /test {
mytest;
}
location /echo {
echo "hello haohao";
}
}
}

#
[/code]
config
[code="java"]
# cat config
ngx_addon_name=ngx_http_echo_module
HTTP_MODULES="$HTTP_MODULES ngx_http_echo_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_echo_module.c $ngx_addon_dir/haolog.c"
NGX_ADDON_DEPS="$NGX_ADDON_DEPS $ngx_addon_dir/haolog.h"
CORE_LIBS="$CORE_LIBS -lpcre"
#
[/code]
termlib.js的调用
[code="java"]
# cat index.html

<html>
<head>
<title>termlib Chrome Sample</title>
<link rel=stylesheet type=text/css href="termlib.css">
<script language="JavaScript" type="text/javascript" src="termlib.js"></script>
<script language="JavaScript" type="text/javascript" src="../jquery.min.js"></script>

<script language="JavaScript" type="text/javascript">
<!--
function ajaxtest(){
$.ajax({
type: "GET",
url: "../echo?ls%20-l",
success: function (data) {
$("#haotest").html("this data:"+data);
},
error: function (msg) {
alert(msg);
}
});
}
var term = new Array();

function termOpen(n) {
if (termToSet) return; // do not open while there is modal dialog
n = parseInt(n);
if ((!n) || (isNaN(n))) n = 1;
var termid = 'terminal'+n;
if (!term[n]) {
term[n] = new Terminal(
{
x: 0,
y: 0,
id: n,
termDiv: 'termDiv'+n,
frameWidth: 1,
frameColor: '#aaaaaa',
bgColor: '#eeeeee',
greeting: 'Terminal ready.',
handler: termHandler,
exitHandler: termChromeHide
}
);
term[n].colorsetting=1;
if (term[n]) {
termChromeShow(n);
term[n].open();
}
}
else if (term[n].closed) {
termSetChromeState(n, true);
termChromeShow(n);
term[n].open();
}
else {
termSetChromeState(n, true);
}
termBringToFront(n);
}
function dump_obj(myObject) { //hao
var s = "";
for (var property in myObject) {
s = s + "\n "+property +": " + myObject[property] ;
}
return s;
}
function termHandler() {//hao
this.newLine();
var line = this.lineBuffer;
if (line != '') {
if (line == 'exit'){
this.close();
}else{
var obj=this;
$.ajax({
type: "GET",
url: "../echo?"+line,
async:false,
success: function (data) {
$("#haotest").html("this data:"+data);
//obj.type(data);//hao
obj.write(data);//hao
},
error: function (msg) {
// obj.write(dump_obj(msg));
$("#haotest").html("this error:"+dump_obj(msg));
}
});
}
}
this.prompt();
}

function termSetChromeState(n, v) {
var header = 'termHeader'+n;
var classname = (v)? 'termHeaderActive':'termHeaderInactive';
if (document.getElementById) {
var obj = document.getElementById(header);
if (obj) obj.className = classname;
}
else if (document.all) {
var obj = document.all[header];
if (obj) obj.className = classname;
}

}

function termChromeShow(n) {
var div = 'terminal'+n;
TermGlobals.setElementXY(div, 210+n*20, 30+n*20);
TermGlobals.setVisible(div,1);
if (document.getElementById) {
var obj = document.getElementById(div);
if (obj) obj.className = 'termShow';
}
else if (document.all) {
var obj = document.all[div];
if (obj) obj.className = 'termShow';
}
}

function termChromeHide() {
var div='terminal'+this.id;
TermGlobals.setVisible(div,0);
if (document.getElementById) {
var obj = document.getElementById(div);
if (obj) obj.className = 'termHidden';
}
else if (document.all) {
var obj = document.all[div];
if (obj) obj.className = 'termHidden';
}
if (termToSet==this.id) closeSettings(0);
}

function termClose(n) {
if ((term[n]) && (term[n].closed == false)) term[n].close();
}

function termBringToFront(n) {
for (var i=1; i<term.length; i++) {
if ((n!=i) && (term[i])) {
var obj=(document.getElementById)? document.getElementById('terminal'+i):document.all['terminal'+i];
if (obj) obj.style.zIndex=1;
termSetChromeState(i, false);
}
}
var obj=(document.getElementById)? document.getElementById('terminal'+n):document.all['terminal'+n];
if (obj) obj.style.zIndex=2;
termSetChromeState(n, true);
term[n].focus();
}

var termToSet=0;

function termConfigure(n) {
var t=term[n];
if (parseFloat(t.version)<1.03) {
alert('This utility requires termlib.js 1.03 or better.');
return;
}
var color = t.colorsetting;
termToSet = n;
var f=document.forms.settingvalues;
f.rows.value=t.conf.rows;
f.cols.value=t.conf.cols;
f.color[color-1].checked=true;
var div='settingsdialog';
TermGlobals.setVisible(div,1);
if (document.getElementById) {
var obj = document.getElementById(div);
if (obj) obj.className = 'termShow';
}
else if (document.all) {
var obj = document.all[div];
if (obj) obj.className = 'termShow';
}
var td='terminal'+n;
objs = (document.getElementById)? document.getElementById(td):document.all[td];
if (obj) TermGlobals.setElementXY(div, parseInt(objs.style.left)+26, parseInt(objs.style.top)+26);
TermGlobals.keylock=true;
}

function closeSettings(state) {
var t=term[termToSet];
if (state) {
var f=document.forms.settingvalues;
var color = 1
if (f.color[1].checked) color=2
else if (f.color[2].checked) color=3
else if (f.color[3].checked) color=4;
var rows = parseInt(f.rows.value);
var cols = parseInt(f.cols.value);
if ((isNaN(rows)) || (rows<2) || (isNaN(cols)) || (cols<4)) {
rows=t.conf.rows;
cols=t.conf.cols;
}
var changed=((rows==t.conf.rows) && (cols==t.conf.cols) && (color==t.colorsetting))? false:true;
t.colorsetting=color;
var rstring= 'New Settings: Terminal set to '+rows+' rows, '+cols+' cols, ';
if (color==1) {
t.conf.bgColor='#eeeeee';
t.conf.fontClass='term';
rstring+='black on white.';
}
else if (color==2) {
t.conf.bgColor='#181818';
t.conf.fontClass='term2';
rstring+='white on black.';
}
else if (color==3) {
t.conf.bgColor='#181818';
t.conf.fontClass='term3';
rstring+='green on black.';
}
else if (color==4) {
t.conf.bgColor='#779977';
t.conf.fontClass='term4';
rstring+='black on green.';
}
if (changed) {
t.cursorOff();
t.conf.rows=t.maxLines=rows;
t.conf.cols=t.maxCols=cols;
t.rebuild();
t.newLine();
t.write(rstring);
t.prompt();
}
}
var div='settingsdialog';
TermGlobals.setVisible(div,0);
if (document.getElementById) {
var obj = document.getElementById(div);
if (obj) obj.className = 'termHidden';
}
else if (document.all) {
var obj = document.all[div];
if (obj) obj.className = 'termHidden';
}
termToSet = 0;
TermGlobals.keylock=false;
}

function settingsSetColor(n) {
document.forms.settingvalues.elements.color[n-1].checked=true;
}

// simple drag & drop

var dragobject=null;
var dragOfsX, dragOfsY;
var lastX, lastY;

function drag(e) {
if (dragobject!=null) {
if (window.event) e = window.event;
var x = (typeof e.clientX != 'undefined')? e.clientX:e.pageX;
var y = (typeof e.clientY != 'undefined')? e.clientY:e.pageY;
dragobject.style.left=x+dragOfsX-lastX;
dragobject.style.top=y+dragOfsY-lastY;
}
}

function dragStart(e) {
if (window.event) e = window.event;
lastX = (typeof e.clientX != 'undefined')? e.clientX:e.pageX;
lastY = (typeof e.clientY != 'undefined')? e.clientY:e.pageY;
}

function dragTerm(n) {
termBringToFront(n)
var div='terminal'+n;
dragobject = (document.getElementById)? document.getElementById(div):document.all[div];
dragOfsX = parseInt(dragobject.style.left);
dragOfsY = parseInt(dragobject.style.top);
}

function dragRelease(e) {
dragobject=null;
}

document.onmousemove=drag;
document.onmouseup=dragRelease;
document.onmousedown=dragStart;

//-->
</script>

<style type="text/css">

</style>
</head>


<body bgcolor="#222222" link="#77dd11" text="#cccccc" alink="#eeeeee" vlink="#77dd11"
topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" marginheight="0" marginwidth="0">

<table border="0" cellspacing="20" cellpadding="0">
<tr valign="top"><td nowrap>
<br> 
</td>
</tr>
<tr><td nowrap>
<a href="javascript:termOpen(1)" onfocus="if(this.blur)this.blur();" onmouseover="window.status='terminal 1'; return true" onmouseout="window.status=''; return true" class="termopen">> open terminal 1  </a>
</td></tr>
<tr><td nowrap>
<a href="javascript:termOpen(2)" onfocus="if(this.blur)this.blur();" onmouseover="window.status='terminal 1'; return true" onmouseout="window.status=''; return true" class="termopen">> open terminal 2  </a>
</td></tr>
<tr><td nowrap>
 
</td></tr>
</table>

<div id="terminal1" style="position:absolute; visibility: hidden; z-index:1" class="termHidden"><table class="termOuterChrome" onmouseup="termBringToFront(1)" cellpadding="1" cellspacing="0"><tr><td><table class="termInnerChrome" cellpadding="0" cellspacing="0">
<tr><td class="termHeaderActive" onmousedown="dragTerm(1); return false" id="termHeader1">Terminal 1</td></tr>
<tr><td class="termMenuPane"><a href="javascript:termClose(1)" onfocus="if(this.blur)this.blur();" class="termMenu">Close</a><a href="javascript:termConfigure(1)" onfocus="if(this.blur)this.blur();" class="termMenu">Settings</a></td></tr>
<tr><td class="termBody"><div id="termDiv1" style="position:relative;"></div></td></tr>
</table></td></tr>
</table></div>

<div id="terminal2" style="position:absolute; visibility: hidden; z-index:2" class="termHidden"><table class="termOuterChrome" onmouseup="termBringToFront(2)" cellpadding="1" cellspacing="0"><tr><td><table class="termInnerChrome" cellpadding="0" cellspacing="0">
<tr><td class="termHeaderActive" onmousedown="dragTerm(2); return false" id="termHeader2">Terminal 2</td></tr>
<tr><td class="termMenuPane"><a href="javascript:termClose(2)" onfocus="if(this.blur)this.blur();" class="termMenu">Close</a><a href="javascript:termConfigure(2)" onfocus="if(this.blur)this.blur();" class="termMenu">Settings</a></td></tr>
<tr><td class="termBody"><div id="termDiv2" style="position:relative;"></div></td></tr>
</table></td></tr>
</table></div>
<div id="settingsdialog" style="position:absolute; visibility: hidden; z-index:3" class="termHidden"><table class="termOuterChrome" cellpadding="1" cellspacing="0"><tr><td><table class="termInnerChrome" cellpadding="0" cellspacing="0" width="300">
<tr><td align="center" class="termMenuPane">
<table borrder="0" cellspacing="0" cellpadding="4" width="260">
<tr><td align="center" class="settings">Terminal Settings</td></tr>
<form name="settingvalues" onsubmit="return false">
<tr><td class="settings"> <br><b>Size</b></td></tr>
<tr><td><table borrder="0" cellspacing="0" cellpadding="2">
<tr valign="middle"><td class="settings">Rows:</td><td><input name="rows" type="text" value="" size="4" class="settings"></tr>
<tr valign="middle"><td class="settings">Cols:</td><td><input name="cols" type="text" value="" size="4" class="settings"></tr>
</table></td></tr>
<tr><td class="settings"> <br><b>Color</b></td></tr>
<tr><td><table borrder="0" cellspacing="0" cellpadding="2">
<tr valign="middle"><td><input type="radio" name="color" value="1"></td><td class="settings"><a href="javascript:settingsSetColor(1)" onfocus="if (this.blur) this.blur();" class="settingsLabel">black on white</a></td></tr>
<tr valign="middle"><td><input type="radio" name="color" value="2"></td><td class="settings"><a href="javascript:settingsSetColor(2)" onfocus="if (this.blur) this.blur();" class="settingsLabel">white on black</a></td></tr>
<tr valign="middle"><td><input type="radio" name="color" value="3"></td><td class="settings"><a href="javascript:settingsSetColor(3)" onfocus="if (this.blur) this.blur();" class="settingsLabel">green on black</a></td></tr>
<tr valign="middle"><td><input type="radio" name="color" value="4"></td><td class="settings"><a href="javascript:settingsSetColor(4)" onfocus="if (this.blur) this.blur();" class="settingsLabel">black on green</a></td></tr>
</table></td></tr>
</form>
<tr><td class="settings" align="right" nowrap> <br><a href="javascript:closeSettings(0)" onfocus="if(this.blur)this.blur();" class="uiButton">Cancel</a> <a href="javascript:closeSettings(1)" onfocus="if(this.blur)this.blur();" class="uiButton">Configure</a><br> </td></tr>
</table>
</table></td></tr>
</table></div>
<input type="button" onclick="ajaxtest()" value="test"/>
<div id="haotest"></div>
</body>
</html>
#
[/code]
点云工具CloudCompare下载、安装与汉化 打开软件后,是英文界面,找到菜单栏【Display】-【Language Translation】,选择简体中文。进入官网后,点击菜单栏【Download】提示需要重启软件才能生效,点OK即可。重启软件后,已经是中文了。选择合适系统进行下载。常规软件安装流程即可。 阅读详情

相关推荐

Jenkins插件下载慢?3分钟搞定国内镜像加速(含华为/腾讯/清华源对比)

本文详细介绍了如何通过国内镜像源加速Jenkins插件下载,包括华为云、腾讯云和清华源等主流镜像站的性能对比及一键配置方案。通过实测数据展示华为云镜像站表现最佳,下载速度达19.4MB/s,并提供sed命令、管理界面配置和Docker定制三种高效加速方案,帮助开发者快速解决插件下载慢的问题。

sql99的博客 320

更优于 Shellinabox 的 web shell 工具 -- ttyd

ttyd 是一个运行在服务端,客户端通过web浏览器访问从而连接后台 tty (pts伪终端)接口的程序,把 shell 终端搬到 web 浏览器中。 WebSocket WebSocket 是 HTML5 开始提供的一种基于HTTP协议与服务器WebServer进行单会话、长连接、全双工的网络技术,依靠这种技术可以实现客户端和服务端的长连接,双向实时通信,以及基于服务端主动向客户端的实时消息推...

chanjiaozhan5779的博客 3136

F5 GTM DNS 实战指南:智能DNS的监控与健康检查机制

本文深入解析F5 BIG-IP GTM智能DNS的核心机制,重点阐述其监控与探针两大功能如何协同工作。监控器负责深度检查服务器应用健康,确保服务可用性;探针则实时测量网络路径质量,实现基于延迟的智能流量调度。文章通过实战配置步骤,指导如何构建逻辑架构、建立iQuery通信、配置业务级健康检查及探针,从而构建高可用、高性能的全局负载均衡解决方案。

weixin_29240711的博客 469

有比较好用的web终端开源项目

一个使用Web技术(HTML、CSS、JavaScript)实现的SSH客户端,允许你通过浏览器访问远程SSH服务器。请注意,虽然这些项目都提供了 web 终端功能,但是在安全性、兼容性和性能等方面都有可能需要额外的调整和配置。在使用这些项目之前,请仔细阅读其文档,并确保理解其安全性如何得到保证,以及如何正确配置和使用。:一个在前端运行的终端模拟器,它旨在创建一个类似于Unix shell的环境。:一个通过网页提供 AJAX 式的终端模拟器或 SSH 客户端的工具,后端使用 C++ 编写。

苏凯的博客 4035

带挂牵引车前向运动模型推导及仿真实现

牵引车-半挂车的车辆结构与普通的车辆相比增加了一个半挂车,它们之间通过鞍座相连接,为了分析半挂牵引车运动过程中的位姿和状态,本文将基于车辆的机械结构建立对应的运动学模型,该模型基于以下假设: 车辆行驶过程中,道路平坦且无凸凹; 车辆低速行驶,且运行过程中车身无侧倾和俯仰运动; 车辆行驶过程中,轮胎无形变,无侧向滑动,且无侧向力; 牵引车和半挂车均满足阿克曼转向几何原理; 牵引车与半挂车不会发现折叠。

jianmo的博客 3182

国产AI芯动力:复旦微FMQL100TAI900 FPGA原型验证板全解析

本文全面解析了复旦微FMQL100TAI900 FPGA原型验证板在国产AI硬件领域的创新突破。该板卡采用全栈国产化设计,具备出色的AI推理性能、视频处理能力和接口生态,特别适合工业质检、智能交通等场景。文章详细介绍了其芯片架构、存储子系统、接口扩展及电源设计,并分享了实战开发经验,为开发者提供了一套可靠的国产计算平台解决方案。

weixin_29250573的博客 456

能够运行ttl脚本的基于Web的终端仿真器有什么

tera term

HuuXiaoTian的博客 394

通达信波段交易公式实战:如何用副图指标精准捕捉买卖点(附完整源码)

本文深入解析通达信波段交易副图指标的构建与应用,提供完整源码实现,帮助投资者精准捕捉买卖点。通过趋势强度度量、超买超卖判断及信号过滤机制,结合K线图分析,有效提升波段交易的成功率。

weixin_29306317的博客 606

Web版Telnet工具设计与实现

C/S架构Telnet工具实现原理 C/S架构的Telnet工具实现的主要思想是:界面组件捕获键盘事件,经过过滤、转换将消息发送到服务端,服务通过Telnet第三方开发包,将消息发送给Telnet服务端(多是支持Telnet的设备),然后将设备返回的信息返回到客户端,客户端进行处理后显示在界面。 Termlib组件 同样在B/S中要实现Telnet/SSH功能,也需要实现类似C/S界面组件功

优快云:ICTCamera,新浪微博:ITCamera。 5261

Android11 关于三方应用获取su权限

SELinux,全称Security-Enhanced Linux,是一种基于Linux内核的安全机制。它通过强制访问控制(MAC)来增强Linux系统的安全性,如果不禁用SELinux,完成下面的修改可能会导致设备进入Recovery界面!adb shell getenforce 为Permissive(宽容模式),查看报错日志,发现是客户apk想使用su命令提权,但是没有权限!对于保护系统资源和防止未经授权访问非常有帮助!系统这边做修改,让su权限下放到三方应用.客户的apk运行报错。

sinat_37429535的博客 1901

2022年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题5)-网络部分解析-附详细代码

2022年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题5)-网络部分解析-附详细代码

bfq05234214的博客 416

term.js 使用指南

term.js 是一个使用 TypeScript 编写的前端组件,它使得应用程序能够在其用户的浏览器中提供功能齐全的终端体验。该项目被诸如 VS Code、Hyper 和 Theia 等知名项目所采用。term.js 支持大多数终端应用程序,如 bash、vim 和 tmux,包括对基于 curses 的应用和鼠标事件的支持。它拥有高性能特性,支持丰富的 Unicode(包括 CJK 表情符号和输

gitblog_00139的博客 1122

CloudCompare源码分析之CCCoreLib模块:ICP算法(阅读经典)

CloudCompare源码分析之CCCoreLib模块:ICP算法(阅读经典)

dayuhaitang1的博客 2551

Shiro第二十三章-多项目集中权限管理及分布式会话

core模块:提供调用接口。 server模块:管理用户、应用和权限。 app模块:各个应用,如一些内部管理系统应用,登录都跳到server登录,权限也从server获取。 部署到nginx 首先修改nginx.conf: 原文是location部分用正则匹配,但是测试报404,所以改成了直接匹配。 #第一个虚拟主机 server { #监听端口 l...

海恩的博客 213

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

利用nginx执行Shell 脚本

利用nginx执行shell脚本 通过远程路径调用Shell 命令是很爽的事情,可以解决很多问题. 况且本文介绍的方法是非阻塞的, 也就是说可以很多并发调用,并不会导致系统服务异常. 首先自行安装openresty,不做介绍了就. 假如我们安装路径为:/southtv/openresty 1 首先安装sockproc git clone https://github.com/juce...

weixin_40429878的博客 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

nginx 图片缓存

最近准备用nginx搭建了一个图片服务器,看中的就是nginx超强的静态文件处理能力。由于图片量比较大,和web服务器(也是nginx)分开运行,虽然web服务器调用图片没用问题,但毕竟是远程调用,肯定没有本地文件系统那么快,因此仍然有优化的空间。使用前的nginx配置12345location ~* ^.+\.(js|ico|gif|jpg|jpeg|png|html|ht...

weixin_34326558的博客 475

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

lua模块demo(redis,http,mysql,cjson,本地缓存)

1. lua模块demo(redis,http,mysql,cjson,本地缓存) 1.1. 配置 在nginx.conf中设置lua_shared_dict my_cache 128m; 开启nginx本地缓存,放到http{} 层 location配置 location /redis-get{ resolver 8.8.8.8; default_type text/html...

weixin_34192993的博客 172

微服务学习笔记

springcloud学习总结

qq_43241216的博客 192

spring cloud eureka + feign,api远程调用

网上教程不少,有些就是复制粘贴,不结合实际生产。 eureka不再阐述。 一般正常开发会有多个工程,且多个module。 我的习惯是:   eureka server、权限、config、gateway 这类插件放在一个工程 --- Server   其它实际业务                       --- Client Client中会存在于多个mod...

weixin_30695195的博客 254

黑马头条day1 环境搭建 SpringCloud微服务(注册发现,服务调用,网关)

第一天就是搭一下环境 然后配置一下微服务 nacos feign gateway其实时间主要浪费在下载虚拟机镜像了 不是很难 争取一天就能完成一天的内容吧。

m0_48362854的博客 576

dubbo与zookeeper

上个项目中用到了zookeeper+dubbo 简单说下我们现在的系统架构 http访问到服务器要经过的内容:阿里的一些安全机制就不说了【用到了阿里服务器】 直接说Nginx —Tomcat –db nginx就是一个负载均衡左右、又一次面试问到了我nginx的反向代理、现在想了想面试官要问的应该是 域名的反向代理 就是使用一个域名去指定某个端口具体就是 http://blog...

For_Mr_Liao的博客 122

电商网站项目总结(分布式多模块+SSM+Mysql+Redis+ActiveMQ)

电商网站项目总结(分布式多模块+SSM+Mysql+ActiveMQ+HTTPClient+Dubbo+短信验证码+Redis

李子的博客 4637

Nginx RTMP 网络调用模块 (ngx_rtmp_netcall_module) 详细分析

Nginx RTMP 网络调用模块为 RTMP 服务器与外部系统之间提供了实时通信机制,支持 HTTP 请求的发送和接收、数据过滤、以及 Memcache 操作。该模块的关键功能是通过网络调用回调机制来扩展 RTMP 服务器的功能,能够在实时流媒体服务中与外部系统(如监控、数据库、录制服务器等)进行交互。对于初学者来说,理解模块的核心在于如何通过创建网络调用会话,如何格式化 HTTP 请求,并如何处理网络数据的发送和接收。

大牛直播SDK 1163

Python 运维脚本

【代码】Python 运维脚本。

weixin_42816196的博客 781

【微服务】Day19(RestTemplate远程调用、Nginx、Linux部署java项目)

简单来说Web服务器就是一个能够接收http请求并作出响应的程序webServer项目(二阶段项目)就是一个我们手写的Web服务器我们现在开发的标准SpringBoot项目启动时内置的Web服务器叫Tomcat实际上我们业界中还有很多Web服务器,它们具备很多不同的特征网关Gateway项目使用Netty服务器,Netty服务器内部是NIO的所以性能更好下图以Tomcat为例,解释请求响应流程大多数情况我们会使用Tomcat作为Web服务器它是我们请求\响应流程中的核心组件。

shortcutsuccess的博客 565

部署一个nginx的服务器之各大模块讲解

部署一个最基本的nginx的服务器及其最基本的配置(搭建之后你想实现什么功能都可以在这个基础上添加) 1.什么是nginx? Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务 2.nginx的优点? Nginx 可以在大多数 Unix Linux OS 上编译运行,并有 Windows 移植版。 Nginx 是一个很强大的...

asufeiya的博客 1908
上一篇: thirft连接hbase的例子
下一篇: wordpress的helloworld
linux内核控
博客等级 码龄19年 41粉丝 638原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值