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
- Open the .ktr in Spoon to see whether it loads; re-save the step's settings
- Diff the SSH step XML block against a known-good transformation
- Restore the transformation from version control/backup
- 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
- Do not hand-edit .ktr files; use Spoon
- Keep generator and consumer Pentaho versions aligned
- Store transformations in version control for recovery
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
- FuzzyMatchMeta.Exception.UnableToLoadStepInfoFromXML
- GetPreviousRowFieldMeta.Exception.UnableToReadStepInfoFromXM…
- GetXMLDataMeta.Exception.ErrorLoadingXML (localized message…
- InsertUpdateMeta.Exception.UnableToReadStepInfoFromXML
- JsonInputMeta.Exception.ErrorLoadingXML
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)