pentaho/pentaho-kettle · error · KettleXMLException

SSHMeta.Exception.UnableToReadStepInfo

Error message

SSHMeta.Exception.UnableToReadStepInfo

What it means

SSHMeta.Exception.UnableToReadStepInfo is thrown when deserializing the SSH step's settings from transformation XML (loadXML -> readData). Any exception while reading XML tags (missing node, malformed XML, decrypt failure) is wrapped in a KettleXMLException with this message. It means the step definition stored in the .ktr file is unreadable.

Solutions

  1. Open the .ktr in Spoon to see whether it loads; re-save the step's settings
  2. Diff the SSH step XML block against a known-good transformation
  3. Restore the transformation from version control/backup
  4. Inspect the wrapped cause for the specific XML parsing failure
Defensive patterns

Strategy: try-catch

Validate before calling

// validate the .ktr before use:
xmllint --noout transformation.ktr && echo OK

Try / catch

try {
  transMeta = new TransMeta(ktrPath);
} catch (KettleXMLException e) {
  logError("Cannot read SSH step from XML: " + e.getCause());
  throw e;
}

Prevention

When it happens

Trigger: Loading a .ktr whose SSH step XML is malformed or missing expected tags, or Encr.decryptPasswordOptionallyEncrypted failing on a corrupted stored password.

Common situations: Hand-edited transformation files; files from incompatible Pentaho versions; truncated/corrupted XML transfer.

Understand the failure class

Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/52a274b6af62ccdc. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/ssh/SSHMeta.java:423

      serverName = XMLHandler.getTagValue( stepnode, ATTR_SERVER_NAME );
      userName = XMLHandler.getTagValue( stepnode, ATTR_USER_NAME );
      password = Encr.decryptPasswordOptionallyEncrypted( XMLHandler.getTagValue( stepnode, ATTR_PASSWORD ) );

      usePrivateKey = "Y".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, ATTR_USE_PRIVATE_KEY ) );
      keyFileName = XMLHandler.getTagValue( stepnode, ATTR_KEY_FILE_NAME );
      passPhrase =
        Encr.decryptPasswordOptionallyEncrypted( XMLHandler.getTagValue( stepnode, ATTR_PASS_PHRASE ) );
      stdOutFieldName = XMLHandler.getTagValue( stepnode, ATTR_STD_OUT_FIELD_NAME );
      stdErrFieldName = XMLHandler.getTagValue( stepnode, ATTR_STD_ERR_FIELD_NAME );
      timeOut = XMLHandler.getTagValue( stepnode, ATTR_TIME_OUT );
      proxyHost = XMLHandler.getTagValue( stepnode, ATTR_PROXY_HOST );
      proxyPort = XMLHandler.getTagValue( stepnode, ATTR_PROXY_PORT );
      proxyUsername = XMLHandler.getTagValue( stepnode, ATTR_PROXY_USERNAME );
      proxyPassword =
        Encr.decryptPasswordOptionallyEncrypted( XMLHandler.getTagValue( stepnode, ATTR_PROXY_PASSWORD ) );

    } catch ( Exception e ) {
      throw new KettleXMLException( BaseMessages.getString( PKG, "SSHMeta.Exception.UnableToReadStepInfo" ), e );
    }
  }

  @Override
  public void readRep( Repository rep, IMetaStore metaStore, ObjectId idStep, List<DatabaseMeta> databases )
    throws KettleException {

    try {
      dynamicCommandField = rep.getStepAttributeBoolean( idStep, ATTR_DYNAMIC_COMMAND_FIELD );
      command = rep.getStepAttributeString( idStep, ATTR_COMMAND );
      commandfieldname = rep.getStepAttributeString( idStep, ATTR_COMMAND_FIELD_NAME );
      serverName = rep.getStepAttributeString( idStep, ATTR_SERVER_NAME );
      port = rep.getStepAttributeString( idStep, ATTR_PORT );
      userName = rep.getStepAttributeString( idStep, ATTR_USER_NAME );
      password = Encr.decryptPasswordOptionallyEncrypted( rep.getStepAttributeString( idStep, ATTR_PASSWORD ) );

      usePrivateKey = rep.getStepAttributeBoolean( idStep, ATTR_USE_PRIVATE_KEY );
      keyFileName = rep.getStepAttributeString( idStep, ATTR_KEY_FILE_NAME );

View on GitHub (pinned to f3058517a1)