pentaho/pentaho-kettle · error · KettleException

JobSFTPPUT.Error.CanNotFindRemoteFolder

JobSFTPPUT.Error.CanNotFindRemoteFolder

Error message

JobSFTPPUT.Error.CanNotFindRemoteFolder

What it means

During execution of the SFTP PUT job entry, the target remote directory (realSftpDirString) does not exist on the SFTP server and createRemoteFolder is disabled, so the entry aborts with this localized error instead of creating the folder. It is a pre-flight validation of the remote destination.

Solutions

  1. Enable 'Create remote folder' (createRemoteFolder) on the job entry
  2. Correct the destination SFTP directory path in the job entry settings
  3. Create the folder manually on the SFTP server or have an earlier job entry create it
  4. Verify the SFTP user has permission to see/create the folder

Example fix

// before (entry config XML)
<createRemoteFolder>N</createRemoteFolder>
// after
<createRemoteFolder>Y</createRemoteFolder>
Defensive patterns

Strategy: validation

Validate before calling

// Java — before executing the entry
SFTPClient client = new SFTPClient( ... );
client.connect( host, port, user, pass );
boolean ok = client.folderExists( remoteDir );
if ( !ok && !createRemoteFolder ) {
  throw new IllegalStateException( "Remote folder missing and createRemoteFolder is off: " + remoteDir );
}

Try / catch

try {
  jobEntry.execute( result, nr );
} catch ( KettleException e ) {
  if ( e.getMessage().contains( "CanNotFindRemoteFolder" ) ) {
    logError( "Create the remote folder or enable createRemoteFolder" );
  }
  result.setResult( false );
}

Prevention

When it happens

Trigger: sftpclient.folderExists(realSftpDirString) returns false while isCreateRemoteFolder() is false, immediately before moving to the remote spool directory to upload files.

Common situations: Typo in the remote folder path; folder removed on the server between runs; 'Create remote folder' checkbox left unchecked in the SFTP PUT dialog; wrong user home directory on the SFTP server.

Related errors


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

Appendix: source

Thrown at plugins/put-file-sftp/impl/src/main/java/org/pentaho/di/job/entries/sftpput/JobEntrySFTPPUT.java:809

      String realProxyHost = environmentSubstitute( getProxyHost() );
      if ( !Utils.isEmpty( realProxyHost ) ) {
        // Set proxy
        sftpclient.setProxy(
          realProxyHost, environmentSubstitute( getProxyPort() ), environmentSubstitute( getProxyUsername() ),
          environmentSubstitute( getProxyPassword() ), getProxyType() );
      }

      // login to ftp host ...
      sftpclient.login( realPassword );
      // Don't show the password in the logs, it's not good for security audits
      // logDetailed("logged in using password "+realPassword); // Logging this seems a bad idea! Oh well.

      // move to spool dir ...
      if ( !Utils.isEmpty( realSftpDirString ) ) {
        boolean existfolder = sftpclient.folderExists( realSftpDirString );
        if ( !existfolder ) {
          if ( !isCreateRemoteFolder() ) {
            throw new KettleException( BaseMessages.getString(
              PKG, "JobSFTPPUT.Error.CanNotFindRemoteFolder", realSftpDirString ) );
          }
          if ( log.isDetailed() ) {
            logDetailed( BaseMessages
              .getString( PKG, "JobSFTPPUT.Error.CanNotFindRemoteFolder", realSftpDirString ) );
          }

          // Let's create folder
          sftpclient.createFolder( realSftpDirString );
          if ( log.isDetailed() ) {
            logDetailed( BaseMessages.getString( PKG, "JobSFTPPUT.Log.RemoteFolderCreated", realSftpDirString ) );
          }
        }
        sftpclient.chdir( realSftpDirString );
        if ( log.isDetailed() ) {
          logDetailed( BaseMessages.getString( PKG, "JobSFTPPUT.Log.ChangedDirectory", realSftpDirString ) );
        }
      } // end if

View on GitHub (pinned to f3058517a1)