想实现的效果如题,我自己试试找不到解决方法,新手刚接触delphi几个月,大牛勿喷啊 通过cmd运行批处理文件,能连上linux服务器不能识别linux命令(已经安装ssh)
直接delphi里shellexecute(‘ssh2.exe’,sw_show)显示一下ssh2的命令行窗口就自己退出了,看了 进程的确退出了
用shellexecute执行ssh自带的client也不知道该怎么带参数
直接delphi里shellexecute(‘ssh2.exe’,sw_show)显示一下ssh2的命令行窗口就自己退出了,看了 进程的确退出了
用shellexecute执行ssh自带的client也不知道该怎么带参数
解决方案 »
- textout 两行输出问题
- 请问在powerdesigner中怎样制作测试数据 ,急!!!
- Never-build package 'classlibPkg' requires always-build package 'EhLib70'
- 程序创建控件,怎么创建这个控件的事件啊?
- 请问各位大侠。
- 一个填词的小软件,大家帮忙测试测试?;-P
- dbgrid格式化显示逻辑字段
- 求用Delphi 开发类似 Windows7 桌面小工具 示例源码,谢谢!
- 走过路过不要错过,quickreport的简单问题。这是小弟能给的最高分了,在线
- 简单问题:类里面的属性可以定义默认值吗?
- Delphi7 WebService 远程访问无返回 死机
- 请问delphi中的record结构怎样初始化
找一下Tdoscommand控件
UINT32 CheckTcuOrFmuVer(UINT32 461, BOARD_TYPE 431){UINT8 361 = 332;UINT8 ucAddr = 332;
UINT8 ucBuf[462] = {0};UINT32 ulRet = CCU_ERR; PCCU_CHAN_T pstChan = 441;
PRS485_BOARD_T pstNode = 441;if ( (CCU_485_TCU_TYPE_CC != 431) && (CCU_485_FMU_TYPE_CA != 431) )
{ return 11;}443, &361, &ucAddr);444; 445;CHECK_PARA2_NULL_RN(pstChan, pstNode, 11);
if ( pstNode->431 != 431){return 11;}ulRet = Exec485ProtolCmd(461, TCU_ENV_ALARM_CMD, ucBuf, 0);
if ( CCU_OK == ulRet ){if ( CCU_485_TCU_TYPE_CC == 431 ){pstNode->ulTcuFlag = CCU_TRUE;}
else if ( CCU_485_FMU_TYPE_CA == 431 ){pstNode->ulFmuFlag = CCU_TRUE;}}221;}
47创建节点 CCU_NULL_BYTE 471 CHECK_RET_OK_RN(ulRet, ulRet) 472 return CCU_ERR_MPI_BUFFER_OVERFLOW 473
g_ast485BoardInfo[ucChanNum][ucAddr] 474 enBoardType 475 enShelfType 476 enSubType 477
pstNode->ucInitCmdNum 478 pstNode->pstCmdList 479 pstNode->ulIsCreatNodeOK 470 MAX_CCU_INIT_CMD_NUM 077
MAX_CCU_POLL_CMD_NUM 078 CCU_NULL_WORD 079 uwBoardType 076
UINT32 CreateNode(UINT32 461, IN CHAR *pcBarCode, UINT32 ulLen)
{UINT8 ucChanNum = 471;UINT8 ucAddr = 471;UINT32 ulRet = CCU_ERR;UINT8 ucCmdNum = MAX_NODE_CMD_NUM;
UINT8 ucInitLen = 077;.. ucPollLen = 078;UINT32 i = 0;UINT8 aucCmdBuf[MAX_NODE_CMD_NUM] = {0};
.. aucInitBuf[077] = {0};.. aucPollBuf[078] = {0};CCU485_CFG_CmdT stCmdInfo = {0};
PCCU_CHAN_T pstChan = 52;PRS485_BOARD_T pstNode = 52;FILE_CABINET_TABLE 476 = SHELF_TABLE_DEFAULT;
BOARD_TYPE 475 = CCU_485_INVALID_TYPE;UINT16 076 = 079;BOARD_SUBTYPE 477 = PMU_UNKNOW_TYPE;
ulRet = IsResIdRight(461, &ucChanNum, &ucAddr);472;ulRet = GetChanNode(461, &pstChan, &pstNode);472;
/* 如果节点为空,直接返回,此处不该为空 */if (CCU_RESID != 461){CHECK_PARA1_NULL_RN(pstNode, 11);}
/* 机柜类型暂时固定为0xFF */#if 0 /* 获取柜类型 */ulRet = FILE_GetCabinetNumber( &476 );472;#endif
/* 获取板类型 */ulRet = GetBoardType(461, &475);472;
ulRet = GetSubType(476, 475, pstNode->ucRegInfo, pstNode->ulRegLen, &477);472;
/* 通知配置模块生成模板 */ulRet = CFG_CreateNode(461, 475, 477, INIT_CFG_TYPE, (UINT8*)pcBarCode, ulLen);
472;/* 获取初始化命令列表 */ulRet = GetNodeInitCmd(461, aucInitBuf, &ucInitLen);472;
ulRet = GetNodePollCmd(461, aucPollBuf, &ucPollLen);472;/* 传入的barcode长度已经包含了结束符 */
if ( (ulLen + 1) > MAX_CCU_BARCODE_LEN){return CCU_ERR_MPI_OUTOFSPACE; }
CCU_MemCpy(pstNode->cBarCode, pcBarCode, (INT32)ulLen);/* 必需加结束符,上层没传入,但后面会用到 */
pstNode->cBarCode[ulLen] = '\0';pstNode->476 = 476;478 = ucInitLen;pstNode->477 = 477;
474.ucInitCmdNum = ucInitLen;pstNode->ucPollCmdNum = ucPollLen;if ( (ucInitLen > 077) || (ucPollLen > 078))
{ 473;}CCU_MemCpy(pstNode->aucInitCmd, aucInitBuf, ucInitLen);CCU_MemCpy(pstNode->aucPollCmd, aucPollBuf, ucPollLen);
/* 获取节点命令列表和命令总数 */ulRet = GetNodeCmdNum(461, aucCmdBuf, &ucCmdNum); 472;pstNode->ucCmdCnt = ucCmdNum;
479 = (MANAGE485_CmdT*)CCU_MemAlloc(CCU_MEM_INFO, CCU_MEM_PT_NO, ucCmdNum * sizeof(MANAGE485_CmdT));
if ( (52 == 479)&&(0 != ucCmdNum)){ return 11;}
/* 获取各命令初始参数,并挂接到部件管理节点 */ for ( i = 0 ; i < ucCmdNum; i++ )
{ ulRet = GetCFGCmdInfo(461, 476, pcBarCode, INIT_CFG_TYPE, aucCmdBuf[i], &stCmdInfo);
if ( CCU_OK != ulRet ){ return ulRet;} UpdateCmdInfo(&479[i], &stCmdInfo); }/*对TCU和FMU做新老版本兼容处理*/
if ( (CCU_485_TCU_TYPE_CC == 475) || (CCU_485_FMU_TYPE_CA == 475) ){CheckTcuOrFmuVer(461, 475);}
470 = CCU_TRUE;pstNode->ulNodeFlag = 0;076 = (UINT16)(((UINT16)475<< 8) + 477);
/* 创建告警模块管理节点 */ulRet = ALM_CreateAlarmNode(461, 076);472;
CCU_Printf("\r\n create node 0x%x type 0x%x success\r\n", (unsigned int)461, (UINT8)475);
if(CCU_OK != ALM_SetSensorDisable(461,475,477)){
MANAGER_DBG_ERROR("SetSensorDisable error \r\n");}/* 同步部件时间 */(VOID)CMD_SetDeviceTime(461);return ulRet;}
48向PNP发送异步消息接口,此数据域不包括握手字和命令字 aucSendBuf 481 CCU_NULL_LONG 482
CCU_485CMD_SEND_HEADLENGTH 483
UINT32 SendAsyMsgToPnP(UINT32 461, UINT16 uwCmd, UINT16 uwSeq, TO_PNP_MSG_TYPE enMsgType, UINT8 *pucBuf, UINT32 ulLen)
{UINT16 uwIndex = 079;
UINT32 ulRet = CCU_ERR;UINT32 ulTempLen = 482;UINT8 481[462] = {0}; /* 判断入参 */CHECK;
ulRet = AddToSendToPnPTxTab(461, uwCmd, uwSeq, 0, enMsgType, &uwIndex, pucBuf, ulLen);472;
/* 打印发送给PNP模块的消息 */SEND_TO_PNP(461, uwCmd, uwSeq, enMsgType, uwIndex, pucBuf, ulLen);
481[0] = (UINT8)(uwCmd >> 8);481[1] = (..)uwCmd;481[2] = (..)(uwIndex >> 8);481[3] = (..)uwIndex;
ulTempLen = ulLen + 4;if ( ulTempLen > 462){473;}CCU_MemCpy(&481[483], pucBuf, (INT32)ulLen);
if ( CCU_RESID == 461){ulRet = CCU_SendAPIMsg(461, uwCmd, uwIndex, 481, ulTempLen);
}else{ulRet = PnP_SendMsg(461, uwCmd, uwIndex, 481, ulTempLen);}return ulRet;}
49发送SMS消息给PNP模块 CCU_NODE_STATE_SYNC 491
UINT32 SendSMSMsgToPnP(UINT32 461, UINT16 uwCmd, UINT16 uwSeq, UINT16 uwNetSeq, TO_PNP_MSG_TYPE enMsgType, UINT8 *pucBuf, UINT32 ulLen)
{UINT16 uwIndex = 079;UINT32 ulRet = CCU_ERR; UINT32 ulTempLen = 482;UINT8 481[462] = {0};
CCU_NODE_STATE enState;/* 判断入参 */CHECK;ulRet = MON_GetNodeState(461, &enState);472;
/* 如果节点还没注册完成,不允许下发消息 */if ( 491 != enState ){return CCU_485_ERR_NODE_NOSYNC;}
ulRet = AddToSendToPnPTxTab(461, uwCmd, uwSeq, uwNetSeq, enMsgType,\
&uwIndex, pucBuf + 483, ulLen - 483); 472;481[0] = (UINT8)(uwCmd >> 8);
481[1] = (UINT8)uwCmd;481[2] = (UINT8)(uwIndex >> 8);481[3] = (UINT8)uwIndex;ulTempLen = ulLen - 483;
if ( (ulTempLen + 483) > (462)){ 473;}CCU_MemCpy(&481[483], &pucBuf[483], (INT32)ulTempLen);
return(PnP_SendMsg(461, uwCmd, uwIndex, 481, ulLen)); }
UINT32 GetInitingNode(UINT8 ucChanNum, PRS485_BOARD_T *ppstNode)
{UINT32 i = 0;PRS485_BOARD_T pstNode = 52;CHECK;501{return 11;}for ( i = 0 ; i < MAX_CCU_NODE_NUM; i++ )
{pstNode = g_stCCUChan[ucChanNum].pstNodeList[i];if ( 52 == pstNode){ continue;}else{
if ( CCU_FALSE == 502){*ppstNode = g_stCCUChan[ucChanNum].pstNodeList[i];221;}else{ continue;}}} 222;}
51判断是否是TCU或FMU老版本,就是不支持环境监控协议的版本
BOOL IsFmuOrTcuOldVer(BOARD_TYPE 475, UINT8 ucCmd, UINT32 ulFlag1, UINT32 ulFlag2)
{if ( ((CCU_485_TCU_TYPE_CC == 475)
&&(ucCmd >= TCU_ENV_ALARM_CMD) &&(CCU_FALSE == ulFlag1))||((CCU_485_FMU_TYPE_CA == 475)
&&(ucCmd >= TCU_ENV_ALARM_CMD)&&(CCU_FALSE == ulFlag2)) ){return CCU_TRUE;}return CCU_FALSE;}
52 500ms定时处理, 此处主要做每500ms下发一条配置命令的操作 pstNode->enHswState 521
CCU_NODE_STATE_REG 522 pstNode->ucCurInitPos 523 pstCmd->ucCmd 524 pstMsg->ucChanNum 525
VOID ProcTimer500msMsg(PMANAGE_MSG_FRAME pstMsg){UINT32 ulLen = 482; UINT32 ulRet = 482;
PRS485_BOARD_T pstNode = 52;PMANAGE485_CmdT pstCmd = 52;UINT8 ucChanNum = 471;UINT8 ucAddr= 471;
CHECK;ulRet = GetInitingNode(525, &pstNode);CHECK_RET_OK(ulRet);CHECK_PARA1_NULL(pstNode);
ucChanNum = Get485ChanNo(pstNode->461);ucAddr = Get485NodeAddr(pstNode->461);if ( 501 ){return;}
/* 如果没有初始化命令,直接退出 */if ( (0 == 478) && (CCU_TRUE == 470)){502 = CCU_TRUE;521 = 522;
474.ucIsInitOK = CCU_TRUE;return ;}ulRet = GetCmdInfo(pstNode, pstNode->aucInitCmd[523], &pstCmd);
CHECK_RET_OK(ulRet);CHECK_PARA1_NULL(pstCmd);ulLen = pstCmd->uwlen - 483;
if ( ulLen > 462 ){return;}/* 如果是TCU和FMU的老版本,不支持0x6x命令,直接置初始化成功,返回 */
if (CCU_TRUE==IsFmuOrTcuOldVer(pstNode->475,524,pstNode->ulTcuFlag,pstNode->ulFmuFlag)){523 = 478;521=522;
502 = CCU_TRUE;474.ucIsInitOK = CCU_TRUE;return; }/* 此处认为命令数据域不包含命令字和握手字 */
ulRet = Exec485ProtolCmd(pstNode->461, 524, pstCmd->aucCmdData, ulLen);
if ( CCU_OK != ulRet ){ pstCmd->ucInitFailCnt++;/* 如果连续执行失败,跳过此条命令 */
if ( pstCmd->ucInitFailCnt >= MAX_CMD_INIT_CNT ){523++;}}else{/* 当前需配置命令下标加1 */523++;}
if ( 523 == 478){502 = CCU_TRUE;521 = 522;474.ucIsInitOK = CCU_TRUE;}return;}
我安装了那个控件(d5的,我下到两个版本另一个函数好像多些,不知道哪个好用,),输入dos命令可以将结果取出,但是执行ssh2 [email protected]的时候没有结果显示,没有提示输入密码,直接输入密码的的话不是命令会抛出异常。麻烦你能给我一个实现交互的方法吗?
运行时程序输入命令,需要与命令行程序的状态对应
那就写到bat
由程序winexec('xxx.bat',...)就行了
ssh2 [email protected] -w c:\.txt
gcc -o .....执行不成功,即使换成ls也不行感觉是不能识别linux命令
那bat不行的,只能Tdoscommand
procedure TForm1.dscmnd1NewLine(Sender:TObject; NewLine:string;
OutputType:TOutputType);
begin
mmo1.Lines.Add('DOS|' + formatdatetime('hh:nn:ss.zzz', now) + ':' + newline);
end;procedure TForm1.btn1Click(Sender:TObject);
begin
if edt1.Text <> '' then
begin
try
dscmnd1.CommandLine := edt1.Text;
dscmnd1.Execute;
except
ShowMessage('命令执行失败');
end;
end;
end;最简单的实现,能把dos命令结果显示,但是登录linux时没有结果返回
看了ssh2的帮助那个-w只是读取密码,没有能执行外部文件的,,,比较鸡肋。所以只能想办法跟cmd交互了
plink.exe是标准的控制台程序
向此线程发命令(linux命令了)只是一个函数而已