shadow1ng/fscan · error

target_file_not_specified

Error message

target_file_not_specified

What it means

Guard in SystemdServicePlugin.Scan: the required config.PersistenceTargetFile is empty, so there is no service file path to create or hijack. The scan cannot proceed and returns a failed result naming the missing configuration key.

Source

Thrown at plugins/local/systemdservice.go:56

	var output strings.Builder

	if runtime.GOOS != "linux" {
		output.WriteString(i18n.GetText("systemdservice_linux_only") + "\n")
		return &plugins.Result{
			Success: false,
			Output:  output.String(),
			Error:   fmt.Errorf("%s", i18n.Tr("unsupported_platform", runtime.GOOS)),
		}
	}

	// 从config获取配置
	targetFile := config.PersistenceTargetFile
	if targetFile == "" {
		output.WriteString(i18n.GetText("persistence_file_required") + "\n")
		return &plugins.Result{
			Success: false,
			Output:  output.String(),
			Error:   fmt.Errorf("%s", i18n.GetText("target_file_not_specified")),
		}
	}

	// 检查目标文件是否存在
	if _, err := os.Stat(targetFile); os.IsNotExist(err) {
		output.WriteString(i18n.Tr("target_file_not_exist", targetFile) + "\n")
		return &plugins.Result{
			Success: false,
			Output:  output.String(),
			Error:   err,
		}
	}

	// 检查systemctl是否可用
	if _, err := exec.LookPath("systemctl"); err != nil {
		output.WriteString(i18n.Tr("systemctl_unavailable", err) + "\n")
		return &plugins.Result{
			Success: false,

View on GitHub (pinned to 95cc12e753)

Solutions

  1. Set config.PersistenceTargetFile to the absolute path of the file to manage
  2. Check the config file/template for the corresponding key and populate it
  3. Add early config validation so missing required fields are rejected before plugin execution

Example fix

// before
cfg := plugins.Config{} // PersistenceTargetFile empty
res := p.Scan(cfg)
// after
cfg := plugins.Config{PersistenceTargetFile: "/opt/myapp/myapp"}
res := p.Scan(cfg)
Defensive patterns

Strategy: validation

Validate before calling

if cfg.PersistenceTargetFile == "" {
    return errors.New("PersistenceTargetFile must be set")
}
if _, err := os.Stat(cfg.PersistenceTargetFile); err != nil {
    return fmt.Errorf("target file check: %w", err)
}

Prevention

When it happens

Trigger: Calling Scan with a Config whose PersistenceTargetFile is the empty string.

Common situations: Config struct initialized with zero values and the required path never set; YAML/JSON config missing the persistence target key; user forgot to point at the executable to persist.

Understand the failure class

Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.

Related errors


AI-assisted analysis of shadow1ng/fscan@95cc12e753 (2026-09-06). Data as JSON: /api/errors/a035b5f2e10e9639. Report an issue: GitHub.