SSH: Fix running remote process in terminal

ConsoleProcess stumbles over the special characters in the remote
command and as a result silently runs the command locally instead.
Prevent that. We can (and should) simply leave these characters alone,
as they have no special meaning on the local machine.

Change-Id: I31b3afe1cf170e51d431372b15f4df3656006959
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Christian Kandeler
2019-06-14 13:37:20 +02:00
parent cd8ebb21e3
commit acfe45c434
6 changed files with 15 additions and 8 deletions

View File

@@ -70,7 +70,9 @@ public:
QProcess::ProcessError error() const; QProcess::ProcessError error() const;
QString errorString() const; QString errorString() const;
bool start(const QString &program, const QString &args); enum class MetaCharMode { Abort, Ignore };
bool start(const QString &program, const QString &args,
MetaCharMode metaCharMode = MetaCharMode::Ignore);
public slots: public slots:
void stop(); void stop();

View File

@@ -65,7 +65,7 @@ void ConsoleProcess::setSettings(QSettings *settings)
d->m_settings = settings; d->m_settings = settings;
} }
bool ConsoleProcess::start(const QString &program, const QString &args) bool ConsoleProcess::start(const QString &program, const QString &args, MetaCharMode metaCharMode)
{ {
if (isRunning()) if (isRunning())
return false; return false;
@@ -75,7 +75,8 @@ bool ConsoleProcess::start(const QString &program, const QString &args)
QtcProcess::SplitError perr; QtcProcess::SplitError perr;
QtcProcess::Arguments pargs = QtcProcess::prepareArgs(args, &perr, HostOsInfo::hostOs(), QtcProcess::Arguments pargs = QtcProcess::prepareArgs(args, &perr, HostOsInfo::hostOs(),
&d->m_environment, &d->m_workingDir); &d->m_environment, &d->m_workingDir,
metaCharMode == MetaCharMode::Abort);
QString pcmd; QString pcmd;
if (perr == QtcProcess::SplitOk) { if (perr == QtcProcess::SplitOk) {
pcmd = program; pcmd = program;

View File

@@ -51,8 +51,10 @@ qint64 ConsoleProcess::applicationMainThreadID() const
return d->m_appMainThreadId; return d->m_appMainThreadId;
} }
bool ConsoleProcess::start(const QString &program, const QString &args) bool ConsoleProcess::start(const QString &program, const QString &args, MetaCharMode metaCharMode)
{ {
Q_UNUSED(metaCharMode);
if (isRunning()) if (isRunning())
return false; return false;

View File

@@ -595,12 +595,12 @@ static QString quoteArgWin(const QString &arg)
} }
QtcProcess::Arguments QtcProcess::prepareArgs(const QString &cmd, SplitError *err, OsType osType, QtcProcess::Arguments QtcProcess::prepareArgs(const QString &cmd, SplitError *err, OsType osType,
const Environment *env, const QString *pwd) const Environment *env, const QString *pwd, bool abortOnMeta)
{ {
if (osType == OsTypeWindows) if (osType == OsTypeWindows)
return prepareArgsWin(cmd, err, env, pwd); return prepareArgsWin(cmd, err, env, pwd);
else else
return Arguments::createUnixArgs(splitArgs(cmd, osType, true, err, env, pwd)); return Arguments::createUnixArgs(splitArgs(cmd, osType, abortOnMeta, err, env, pwd));
} }

View File

@@ -79,7 +79,8 @@ public:
//! Prepare argument of a shell command for feeding into QProcess //! Prepare argument of a shell command for feeding into QProcess
static Arguments prepareArgs(const QString &cmd, SplitError *err, static Arguments prepareArgs(const QString &cmd, SplitError *err,
OsType osType = HostOsInfo::hostOs(), OsType osType = HostOsInfo::hostOs(),
const Environment *env = nullptr, const QString *pwd = nullptr); const Environment *env = nullptr, const QString *pwd = nullptr,
bool abortOnMeta = true);
//! Prepare a shell command for feeding into QProcess //! Prepare a shell command for feeding into QProcess
static bool prepareCommand(const QString &command, const QString &arguments, static bool prepareCommand(const QString &command, const QString &arguments,
QString *outCmd, Arguments *outArgs, OsType osType = HostOsInfo::hostOs(), QString *outCmd, Arguments *outArgs, OsType osType = HostOsInfo::hostOs(),

View File

@@ -201,7 +201,8 @@ void SshDeviceProcess::handleConnected()
this, &SshDeviceProcess::handleProcessStarted); this, &SshDeviceProcess::handleProcessStarted);
connect(&d->consoleProcess, &ConsoleProcess::stubStopped, connect(&d->consoleProcess, &ConsoleProcess::stubStopped,
this, [this] { handleProcessFinished(d->consoleProcess.errorString()); }); this, [this] { handleProcessFinished(d->consoleProcess.errorString()); });
d->consoleProcess.start(cmdLine.first(), cmdLine.mid(1).join(' ')); d->consoleProcess.start(cmdLine.first(), cmdLine.mid(1).join(' '),
ConsoleProcess::MetaCharMode::Ignore);
} else { } else {
connect(d->process.get(), &QSsh::SshRemoteProcess::started, connect(d->process.get(), &QSsh::SshRemoteProcess::started,
this, &SshDeviceProcess::handleProcessStarted); this, &SshDeviceProcess::handleProcessStarted);