想实现的效果如题,我自己试试找不到解决方法,新手刚接触delphi几个月,大牛勿喷啊      通过cmd运行批处理文件,能连上linux服务器不能识别linux命令(已经安装ssh)
      直接delphi里shellexecute(‘ssh2.exe’,sw_show)显示一下ssh2的命令行窗口就自己退出了,看了 进程的确退出了
      用shellexecute执行ssh自带的client也不知道该怎么带参数

解决方案 »

  1.   

    运行命令行交互程序?
    找一下Tdoscommand控件
      

  2.   

    我是想通过dos启动ssh连上linux,之后应该输入的就是linux的命令而不是dos的命令了,不知道控件能不能解决这个问题
      

  3.   

    可以的它允许你的程序向运行的命令行程序发指令(只要是字符串而已,不一定dos还是linux命令)
      

  4.   

    46 ..FMU和TCU新老版本校验 ulResId 461 MAX_485_DATA_LEN 462
    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;
      

  5.   

    474.ucCmdCnt = ucCmdNum; pstNode->475 = 475;474.475 = 475;474.477   = 477;
    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)); }
      

  6.   

    50获取当前需要初始化配置的节点  if ( ucChanNum >= MAX_CCU_CHAN_NUM) 501 pstNode->ucIsInitOK 502
    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;}
      

  7.   


    我安装了那个控件(d5的,我下到两个版本另一个函数好像多些,不知道哪个好用,),输入dos命令可以将结果取出,但是执行ssh2  [email protected]的时候没有结果显示,没有提示输入密码,直接输入密码的的话不是命令会抛出异常。麻烦你能给我一个实现交互的方法吗?
      

  8.   

    两个版本都有bug,不过一般使用没问题你使用plink.exe替代ssh2.exe试一试
    运行时程序输入命令,需要与命令行程序的状态对应
      

  9.   

    用户那边都是直接装好的ssh的客户端,找不到plink,我觉得控件还是的连接cmd运行一条指令然后就关闭cmd了。就想delphi连接linux后执行指定的编译命令就行了
      

  10.   

    就一条命令?
    那就写到bat
    由程序winexec('xxx.bat',...)就行了
      

  11.   

    不行啊,我在bat文件里面试过的
    ssh2 [email protected] -w c:\.txt
    gcc -o .....执行不成功,即使换成ls也不行感觉是不能识别linux命令
      

  12.   

    哦你的gcc是要在ssh2里执行的吧
    那bat不行的,只能Tdoscommand
      

  13.   

    哦,另外,如果ssh2支持登录进去后自动执行一个外部的文本(在ssh2的命令行参数里指定)作为后续命令的话,应该也可以bat了
      

  14.   


    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时没有结果返回
      

  15.   


    看了ssh2的帮助那个-w只是读取密码,没有能执行外部文件的,,,比较鸡肋。所以只能想办法跟cmd交互了
      

  16.   

    能把dos命令结果显示,但是登录linux时没有结果返回说明ssh2.exe不是标准的控制台程序
    plink.exe是标准的控制台程序
      

  17.   

    晚上下个putty用里面的plink试试,但愿可以。这个控件是运行一句命令就开一个线程吗?那怎么能实现交互呢
      

  18.   

    运行plink.exe是开一个线程
    向此线程发命令(linux命令了)只是一个函数而已